【发布时间】: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