在msdn中写了如何查看调试的数据,网址:
http://msdn.microsoft.com/zh-cn/library/vstudio/esta7c62(v=vs.100).aspx
Visual Studio 调试器提供了各种用于检查和修改程序状态的工具。 这些工具中的大多数仅在中断模式下有效。
数据提示是用于在调试过程中查看程序中的变量和对象的有关信息的最方便工具之一。 在调试器处于中断模式时,可以在当前范围内查看变量的值,方法是将鼠标指针置于源窗口中的变量上。 有关更多信息,请参见如何:使用数据提示功能。
可视化工具是 Visual Studio 调试器的新组件,通过它可以以有意义的方式查看对象或变量的内容。 例如,可以使用 HTML 可视化工具来查看 HTML 字符串,因为这样可以解释该字符串并在浏览器中显示出来。 您可以通过数据提示、“监视”窗口、“自动”窗口、“局部变量”窗口或“快速监视”对话框来访问可视化工具。 有关更多信息,请参见 可视化工具。
下面的调试器窗口提供有关程序的重要信息。省略。
如何监视数组:
下面的程序:
int main() { int a[5]={1,2,3,4,5}; for(int i=0;i<5;i++) cout<<a[i]; }
我们点击右键,选择添加监视,
立刻,下面的监视窗口会有值:
我们把程序换成
int *a=new int[5];
for(int i=0;i<5;i++)
{
a[i]=i+1;
}
cout<<endl;
再监视a会发现:结果只显示1,
(注意看a是可折叠的,第一行显示地址,第二行显示内容,注意看类型,第一个是int *,第二个是Int)
为什么?
因为a只是一个指向int【5】首元素0的一个指针而已。我们如何才能查看该指针后面的几个变量的值呢?
这是,我们要点击右键,选择【快速监视】,
填写a,5 (形式是aa,xx. aa表示变量地址,xx是元素个数).
结果:
成功查看了后面几个的值。
条件断点:
选择条件后会弹出设置条件的窗口,如下图所示。比如我们输入i==500的时候触发断点。那么当i==500的时候断点才会触发,其它情况下断点不会被触发。
is true 是表达式为真时命中断点
has changed 是值改变时命中断点
内存断点
根据内存地址设置的断点叫做内存断点,Visual Studio中也叫作数据断点。内存断点只有在指定的地址处的变量被修改时,才会触发,访问指定的地址内容是不会触发内存断点的。
应用场景:在很多情况要,一个变量使用的地方过多,我们不知道这个变量在何时何处被修改。使用内存断点就可以轻松搞定。
具体用法:
在程序中断的情况下,一次选择【调试】->【新建断点】->【新建数据断点(D)…】,会弹出如下对话框:
其中字节计数表示变量的类型大小,比如,int占用4个字节。
示例代码:
int test=0;
int main(){
test=1;
}
1
2
3
4
5
设置了上面的内存断点之后,当test被改变的时候就会触发断点,将程序中断在修改内存断点指定的内存地址的语句的下一条语句处,在VS2012中是这样的。
---------------------
最近在开发一个比较复杂的项目,使用了许多assert宏来进行断言防御式编程,但是有的时候发现许多数据被修改了并非自己期望的值。有的时候也不可能为所有数据都提高读写接口封装来控制,这里就需要使用到数据断点来判断数据什么时候被改写了。
MSDN参考文档
https://msdn.microsoft.com/en-us/library/350dyxd0(v=vs.100).aspx
一.使用数据断点的条件
首先数据断点只支持Native code 也就是C/C++开发的代码,而且只能在调试模式下才能设置(程序运行了才能知道你想关注的变量地址)
如果有C#和C/C++混编的项目,也只有C/C++部分的代码支持数据断点。
https://blog.csdn.net/sesiria/article/details/51995370
gdb有同样的命令,内存断点 watch 地址