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循环,然后使用另一个具有相同名称的变量命中下面的代码时,监视窗口不会跟踪该变量的内存。
您将看到监视窗口仍声明i为10,即使在第二个循环中i现在为0,1,2,...,而在第二个循环之后,i实际上为6,但监视窗口仍声明为10。
监视窗口应该怎么做?我认为,它应该始终向您显示具有该监视名称的变量的值,即在范围内,因为语言规则告诉您在任何给定时间仅这些变量之一在范围内。
这是调试器的监视窗口功能中的一个错误(VS2010似乎廉价地找到了函数中第一个与您在监视中给定名称相匹配的变量,并且顽强地监视了那个内存空间,而不管代码中可能还有什么其他内容,即使具有相同名称的新变量已接管了作用域(此时监视窗口对您说谎!)
当我使用VS2010时,需要留在那儿,而MSFT不会解决旧版本中的错误,我想知道该错误是否仍存在于VS2013中。我可能会很快并行安装VS2013,但是值得一提的是,可以防止其他人被监视窗口声称的变量值误导。(更糟糕的是,当您将鼠标悬停在调试器中代码中的作用域内变量名称上时,该错误值将显示为“工具提示”。
我在VS 2013上遇到过几次相同的问题:(
您总是可以打开反汇编窗口,并检查程序真正在增加什么。您应该查看它是堆栈地址(最有可能在调试模式下)还是寄存器。
您可以在立即窗口或直接在监视窗口中转储寄存器值。与堆栈地址相同。只需输入在反汇编窗口中看到的内容即可。例如:
00DC4095 mov eax,dword ptr [i]
00DC4098 add eax,1
00DC409B mov dword ptr [i],eax
在00DC409B处中断并转储eax。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句