Visual Studio 2010 Professional中不正确的表值

Incorrect watch values in Visual Studio 2010 Professional

本文关键字:不正确 Studio 2010 Professional Visual      更新时间:2023-10-16

我遇到了一个非常奇怪的问题,其中一些变量的手表窗口值似乎与"现实世界"的值不匹配。调试器似乎只是在空间中关闭。下面是显示它的最小代码片段:

printf("%d", pNodes[nNode].nColumn); // watch shows "4"
printf("%d", nColumn); // watch shows "1"
if (pNodes[nNode].nColumn != nColumn)
  continue; // this is NOT called

行为是这样的:

  1. 如果我将手表添加到pNodes[nNode].nColumn,它显示4的值。
  2. 如果我添加一个手表到nColumn,它显示1的值。
  3. 如果我检查表达式pNodes[nNode].nColumn != nColumn在观察窗口,它的计算结果是true
  4. 跳过continue语句!
  5. 我添加了printf()调用来查看发生了什么,printf()打印值11,这似乎与代码"流动"的方式一致(即它不if语句中调用continue

我甚至可以在&pNodes(nNode].nColumn检查内存,内存显示"不正确"的值,手表窗口显示给我。因此,调试器似乎与实际的程序数据或其他东西完全"断开连接"。我正在运行调试构建优化被关闭。我还检查了pNodes不对应于一些全局变量或其他范围更高的变量——似乎只有一个本地版本。

这完全让我困惑!我甚至不知道下一步该去哪里解决问题。如果你有什么想法,我很乐意听听!

谢谢!

所以我想我已经破解了这个案例:罪魁祸首是Struct Member Alignment。我有一堆项目混合在一起,其中一些项目中这个字段的值是不同的。我删除了所有的设置,只是让VS选择默认值,问题已经消失了。

适用的值在4字节之间,在一些项目中Default,在其他项目中完全为空。该值在Configuration Properties/C/c++/Code Generation/Struct Member Alignment下。同样,我最终只是删除了所有项目的值。我认为这在过去的项目中是为了处理一些跨平台问题而设置的,但至少对于我现在所做的工作来说是固定的!

谢谢你的帮助!

如果使用不在作用域中的变量设置watch,这是我在Visual Studio中经常看到的行为。它真的应该说"<不在作用域>"或者其他更有用的东西。

如果你正在执行这些代码行,你仍然看到那些幽灵般的值,我不知道:你确定这是一个调试构建吗?

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放在watch窗口中。

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

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

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

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