VS2010调试器无法在监视窗口中正确跟踪变量,VS2013是否仍然存在此错误?



Visual Studio 2010调试器在跟踪手表变量内存位置时出现问题。有时它会严重误导你,因为VS2010没有显示你认为它显示给你的变量。

例如,如果你在函数中重用了一个变量名,那么随着执行范围的改变,应该在监视窗口中显示哪个内存位置:

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=%dn", i);

现在把变量i放到观察窗口

显然,哪个i(或值)显示在手表窗口很重要。如果运行该程序,您将看到,当它进入for循环时,watch会跟踪for循环的i变量。当它退出for循环,然后用另一个同名变量击中下面的代码时,watch窗口不会跟踪该变量的内存。

您将看到watch窗口仍然声明i为10,即使在第二个循环中i现在是0,1,2,…在第二个循环之后,I实际上是6,但是watch窗口仍然声明I是10。

看表窗口应该做什么?我认为,它应该总是向您显示具有该手表名称的变量的值,即在作用域中,因为语言规则告诉您在任何给定时间内,这些变量中只有一个在作用域中。

这是调试器的监视窗口功能中的一个错误(VS2010似乎便宜地只是找到与您在监视中给出的名称相匹配的函数中的第一个变量,并顽强地监视该内存空间,不管代码中还有什么,即使具有相同名称的新变量已经接管了范围(此时监视窗口现在对您撒谎!)

当我在VS2010上时,需要留在那里,微软不会解决旧版本中的错误,我想知道这个错误是否仍然存在于VS2013中。我可能很快就会并行安装VS2013,但值得指出的是,为了防止其他人被监视窗口声称的变量值所误导。(更糟糕的是,当您将鼠标移到调试器代码中的范围内变量名称上时,错误的值将显示为'工具提示'。

我在VS 2013上多次遇到同样的问题:(

你总是可以打开反汇编窗口,在那里检查程序真正递增的是什么。您应该查看它是堆栈地址(最有可能在调试模式下)还是寄存器。

可以在即时窗口中转储寄存器值,也可以直接在观察窗口中转储寄存器值。堆栈地址也是如此。只需键入您在拆卸窗口中看到的内容。例如:

00DC4095  mov         eax,dword ptr [i]  
00DC4098  add         eax,1  
00DC409B  mov         dword ptr [i],eax  

在00DC409B断点并转储eax

相关内容

最新更新