1 示例代码
#include <iostream>
using namespace std;
class A
{
public:
A();
virtual ~A();
void Add();
private:
int m;
};
A::A()
{
m = 0;
}
A::~A()
{
}
void A::Add()
{
m++;
}
int main()
{
A Test;
for (int i=0;i<10;++i)
{
Test.Add();
}
return 0;
}
很简单的一个程序,我们通过调用Add方法改变成员变量m的值,所以可以针对于变量m设置数据断点和逻辑断点。
2 数据断点
断点作用:用于检测任意变量,包括类中或者结构体中某个成员变量的值发生了变化,如果此时设置了数据断点,只要该变量的值发生了变化就会触发数据断点,导致程序中断。用于Debug时,查找莫名其妙改变值的变量,用于锁定隐藏bug,以及通过堆栈信息梳理逻辑漏洞。
2.1 根据内存地址设置数据断点
参考1中示例代码,针对成员变量m设置数据断点,只要成员变量的值m发生了变化则触发数据断点。
先在示例代码第36行设置一个普通断点,第36行为:
for (int i=0;i<10;++i)
目的是,先执行代码行:
A Test;
使得对象构造成功。
然后对Test对象的成员变量m添加监视,如下图:
然后对监视对象添加&,获取Test.m在内存中的地址,如下图:
然后点击调试-新建断点-数据断点,如下图
然后将Test.m的内存地址填入进入就OK了,F5运行程序,即可触发数据断点。
2.2 根据变量名设置数据断点
如果不想像上述步骤一样通过添加监视获取变量地址,通过变量地址设置数据断点,可以使用变量名的方式。
直接打开调试-新建断点-数据断点,填入&(变量名),运行即可触发数据断点。
3 条件断点
作用:当变量值满足某种条件时,触发断点。
以Test.m == 5触发断点为例。
依然在示例代码第39行设置一个普通断点,第39行为:
用鼠标在该断点上停留,则会出现如下设置按钮:
点击设置按钮-条件,如下图:
在条件表达式中输入:
Test.m == 5
如下图:
然后调试运行程序,即可触发条件断点
如果您觉得这篇博文有用,请访问我的个人站:http://www.stubbornhuang.com/,更多博文干货等着您。