VS Code断点使用及条件断点失效问题
条件断点的使用
这里以vscode为例,其他编辑器应该大差不差。
1. 右键点击想要设置断点行号前面,选择“添加条件断点”。
2. 这里默认选择的就是表达式,也可以设置其他断点形式。在空行中写上条件表达式即可,写完回车即可。
这里需要说明的是:在设置条件断点时,条件表达式通常是在断点所在的作用域内进行求值的。这意味着,如果你在某个函数内部设置了一个条件断点,那么条件表达式中的变量默认是该函数作用域内的局部变量(包括参数)以及全局变量。当然,如果作用域变量和全局变量重名自然是遵从C++的语法的。
3. 如果想要更换条件表达式,同样右键点击想要编辑的断点,选择“编辑断点”即可。
其他断点的使用
命中次数断点
命中次数断点即为此行代码实际运行了多少次后停止。在C++中我这里显示的是:
所以这个可能和编译器有关,我们这里就举例一个python的例子吧。
这里for循环这一行实际运行了4次的时候,i恰好也为4。
记录点
记录点就是这里的日志消息断点,它意味着:命中断点时输出信息而不暂停执行。例如,
这种断点的好处是不会污染源代码仍可以输出日志信息——这是相较于 cout 的好处。另外,在一些性能测试的场景下,我们使用日志消息可以记录性能信息,而设置断点就使程序停止了,达不到这种效果。
这时候我点击调试后,程序并没有暂停,而是直接输出了所有结果。但是我们从“调试控制台”可以看到以下信息:
这里图片并没有截完整。
触发断点
触发断点是一种“睡眠”状态的断点,只有它所依赖的那个断点发生中断时,这个”睡眠“的断点才被唤醒然后一直发挥作用。我们举一个例子:
#include <iostream>
using namespace std;
int main()
{for (int i = 0; i < 10; i++){if (i == 4)cout << "这是4";cout << i;}return 0;
}
在cout<<”这是4"; 这一行设置一个普通断点,然后在cout << i; 这一行设置一个触发断点。只有前一个普通断点触发后,下边的这个断点才会工作。
这里的所依赖断点不仅可以使本文件的,还可以是本项目的其他文件,别忘记点击”确定“。
由上图可见,第二个断点第一次触发的时候是i为4的情况,并非i为0的情况。
条件断点失效
如果你某次发现条件断点不生效,不知道什么问题。那么可能是这几个原因:
1. 多加了一个分号,虽然条件断点上面写的是“表达式”,但是千万不要在条件后面加上分号。
#include <iostream>
using namespace std;
int main()
{for (int i = 0; i < 10; i++){cout << i;}return 0;
}
在 cout 这一行设置条件断点 i==6,末尾千万不要加分号。
2. 设置断点位置错了——在for循环这一行设置断点(这个可能和编译器或者编程语言有关,在C++中,MSVC和GDB都是这样的)
在for循环这一行设置断点,只在第一次进入for循环的时候才停止,每次自增或者判断条件的时候并不会停止的。所以如果你在 for 循环设置条件断点 i==6,自然也不会停止的。必须将断点设置在for循环内部,甚至说设置在单有大括号的一行也是正确的(这种行为可能取决于编译器的实现,有些编译器可能不停止)。