下面的调试器窗口提供有关程序的重要信息。省略。

如何监视数组:

下面的程序:



int main()
{
int a[5]={1,2,3,4,5};
for(int i=0;i<5;i++)
cout<<a[i];
}


我们点击右键,选择添加监视,

vs2010 调试中监视变量_可视化工具

立刻,下面的监视窗口会有值:

vs2010 调试中监视变量_数据_02

我们把程序换成

int *a=new int[5];

for(int i=0;i<5;i++)

{

 a[i]=i+1;

}

cout<<endl;

再监视a会发现:结果只显示1,

vs2010 调试中监视变量_数据_03

注意看a是可折叠的,第一行显示地址,第二行显示内容,注意看类型,第一个是int *,第二个是Int)

为什么?

因为a只是一个指向int【5】首元素0的一个指针而已。我们如何才能查看该指针后面的几个变量的值呢?

这是,我们要点击右键,选择【快速监视】,

填写a,5    (形式是aa,xx. aa表示变量地址,xx是元素个数).

vs2010 调试中监视变量_可视化工具_04

结果:

vs2010 调试中监视变量_调试器_05

成功查看了后面几个的值。

 

条件断点:

选择条件后会弹出设置条件的窗口,如下图所示。比如我们输入i==500的时候触发断点。那么当i==500的时候断点才会触发,其它情况下断点不会被触发。

vs2010 调试中监视变量_html_06

is true  是表达式为真时命中断点

has changed 是值改变时命中断点

 

内存断点

根据内存地址设置的断点叫做内存断点,Visual Studio中也叫作数据断点。内存断点只有在指定的地址处的变量被修改时,才会触发,访问指定的地址内容是不会触发内存断点的。

应用场景:在很多情况要,一个变量使用的地方过多,我们不知道这个变量在何时何处被修改。使用内存断点就可以轻松搞定

具体用法:

在程序中断的情况下,一次选择【调试】->【新建断点】->【新建数据断点(D)…】,会弹出如下对话框:

 vs2010 调试中监视变量_html_07

 

其中字节计数表示变量的类型大小,比如,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++部分的代码支持数据断点。

gdb有同样的命令,内存断点 watch 地址