Visual Studio 的断点系统远不止”在代码行上点击左侧边栏”那么简单。掌握其高级功能可以彻底改变你的调试体验,让你能精准定位问题,而不是在无尽的代码执行中盲目搜索。本文将带你全面了解 Visual Studio 断点系统的各项高级功能。

条件断点

条件断点允许你设置特定条件,只有满足这些条件时调试器才会暂停。

支持如下格式的表达式:

1
2
3
4
5
6
7
8
9
10
// 基本条件
i > 100
name == "admin"

// 复合条件
x > 50 && y < 20 && isValid == true

// 字符串操作(C++)
strcmp(filename, "config.xml") == 0
strlen(buffer) > 255

支持的内置函数如下:

  • strlen(str):获取字符串长度
  • strcmp(str1, str2):比较两个字符串
  • strncmp(str1, str2, n):比较前n个字符
  • strstr(haystack, needle):查找子字符串
  • GetLastError():获取系统错误代码

断点筛选器

当调试多线程或分布式应用时,筛选器能确保断点只在特定环境中触发。

支持如下筛选字段:

  • MachineName
  • ProcessId
  • ProcessName
  • ThreadId
  • ThreadName
1
2
3
4
ThreadId = 1234
ProcessName = "MyApp.exe"
MachineName = "Development-PC"
ThreadName = "WorkerThread"

筛选器的逻辑运算与条件断点有些不一样,逻辑等号使用=,逻辑与使用&,逻辑或使用||,逻辑非使用!,没有不等号。

示例:

1
2
3
4
5
MachineName = "MyPC"
ProcessId = 1234
ThreadId = 1234 & MachineName = "DevPC"
ThreadId = 1234 || ProcessId = 4
!ThreadId = 5678

跟踪器

在“断点”中选择“操作”,输入跟踪指令即可,通常,为了不影响程序执行流,建议同时勾选 ​​“继续执行”​,这样程序运行到此处时就不会中断,而是直接输出信息后继续运行。

支持如下格式的指令:

  • 直接输入字符串,例如 “循环到了这里”。

  • 使用变量名,用大括号 {}括起来,例如 “当前 i 的值为: {i}”。输出时,{i}会被替换为变量 i的实际值。

  • 使用一些预定义的关键字​(以 $开头),例如:

    1
    2
    3
    4
    5
    $ADDRESS- 当前指令地址
    $CALLER- 调用当前函数的函数名称
    $FUNCTION- 当前函数名称
    $TID- 当前线程 ID
    $PID- 当前进程 ID