【问题标题】:VS2010 debugger doesn't track variables correctly in the watch window, does VS2013 still have this bug?VS2010调试器在监视窗口中不能正确跟踪变量,VS2013还有这个bug吗?
【发布时间】:2014-09-25 03:37:38
【问题描述】:

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=%d\n", i);

现在把变量 i 放到监视窗口中。

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

你会看到监视窗口仍然声明 i 是 10,即使在第二个循环中我现在是 0,1,2,...并且在第二个循环之后我实际上是 6,但是监视窗口仍然声明 i是 10。

监视窗口应该做什么?我会争辩说,它应该始终向您显示具有该手表名称的变量的值,即在范围内,因为语言规则告诉您在任何给定时间只有一个变量在范围内。

这是调试器的监视窗口功能中的一个错误(VS2010 似乎只需在函数中找到与您在监视中指定的名称相匹配的第一个变量,并顽固地监视该内存空间,不管其他可能是什么在代码中,即使具有相同名称的新变量已经接管了作用域(此时监视窗口正在欺骗您!)

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

【问题讨论】:

  • @HansPassant 使用名为 i 的块范围变量作为同一函数中两个连续循环的索引不是 WTF。在同一个函数中有两个循环不会自动成为 WTF。我并不是要严厉,但是如果您认为其中任何一个都自动成为 WTF,我会讨厌阅读您的代码。
  • 究竟什么是“WTF”?提供的代码示例只是最简单的代码,可以证明有问题的问题以确认它的存在。实际使用的代码不是这个;这只是重现了同样的问题。

标签: c++ c visual-studio-2010 debugging watch


【解决方案1】:

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

您可以随时打开反汇编窗口并检查程序真正递增的内容。您应该查看它是堆栈地址(很可能在调试模式下)还是寄存器。

您可以在即时窗口中或直接在监视窗口中转储寄存器值。与堆栈地址相同。只需键入您在反汇编窗口中看到的内容。例如:

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

在 00DC409B 中断并转储 eax。

【讨论】:

  • 很高兴知道它仍然是 VS2013 的问题。安装 VS2013 后,必须记录一个错误。我不知道解决这个问题的努力是否值得在它发生的时候遇到麻烦(需要发生的指标)。但我认为调试器监视窗口肯定可以正确跟踪变量。当然,一旦退出循环,首先 i 就会超出范围,如果不能在一段代码中跟踪两个变量进入和超出范围,则应该这样指示 - 至少 - 。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多