Visual Studio 2010调试器在跟踪监视变量内存位置时存在问题。有时它会误导你,因为VS2010没有向你显示你认为它向你显示的变量。
例如,如果在函数中重用变量名,那么当执行范围发生变化时,应在监视窗口CHANGES中显示哪个内存位置:
for (int i=0; i<10; i++) {
i=i+1; // do something, what isn't important
}
int i;
for (i=0; i<5; i++) {
i=i+1; // do something
}
printf("i=%d\n", i);
现在将变量i放在观察窗口中。
显然,观察窗口中显示的i(或值)很重要。如果你运行程序,你会看到,当它进入for循环时,手表会跟踪for循环的i变量。当它退出for循环,然后使用具有相同名称的另一个变量点击下面的代码时,监视窗口不跟踪该变量的内存。
你会看到手表窗口仍然声明我是10,即使在第二个循环中我现在是0,1,2,...并且在第二个循环后我实际上是6,但是观察窗口仍然声明我是10。
观察窗应该做什么?我认为,它应该始终显示带有该监视名称的变量的值,即在范围内,因为语言规则告诉您在任何给定时间只有其中一个变量在范围内。
这是调试器监视窗口功能中的一个错误(VS2010似乎便宜地找到了函数中第一个与你在手表中给出它的名字相匹配的变量,并且不管其他什么东西都可能会看到这个内存空间在代码中,即使一个具有相同名称的新变量已经占用了范围(此时监视窗口现在对你说谎了!)
当我在VS2010上,并且需要留在那里,并且MSFT不会解决旧版本中的错误时,我想知道VS2013中是否仍存在该错误。我可能很快会并行安装VS2013,但值得指出的是防止其他人被观察窗口声称变量值所误导。 (更糟糕的是,当您将鼠标悬停在调试器代码中的范围内变量名称时,该错误值将显示为“工具提示”。
答案 0 :(得分:1)
我在VS 2013上多次遇到同样的问题:(
您始终可以打开反汇编窗口并检查程序实际上正在递增的内容。您应该看到它是堆栈地址(很可能是在调试模式下)还是寄存器。
您可以在立即窗口中转储寄存器值,也可以直接在监视窗口中转储。与堆栈地址相同。只需键入您在反汇编窗口中看到的内容即可。例如:
00DC4095 mov eax,dword ptr [i]
00DC4098 add eax,1
00DC409B mov dword ptr [i],eax
在00DC409B处中断并转储eax。