我遇到了一个非常奇怪的问题,其中一些变量的监视窗口值似乎与它们的“真实世界”值不匹配。调试器似乎在空间中关闭。这是显示它的最微小的代码片段:
printf("%d", pNodes[nNode].nColumn); // watch shows "4"
printf("%d", nColumn); // watch shows "1"
if (pNodes[nNode].nColumn != nColumn)
continue; // this is NOT called
所以这就是行为:
pNodes[nNode].nColumn
,则会显示4
的值。nColumn
,则会显示1
的值。pNodes[nNode].nColumn != nColumn
,则评估为true
。continue
语句!printf()
来电,看看发生了什么,printf()
打印了值1
和1
,这似乎与代码的方式一致“流”(即它不调用continue
语句中的if
。我甚至可以在&pNodes(nNode].nColumn
检查内存,内存显示监视窗口显示的“不正确”值。因此,似乎调试器与实际程序数据或其他东西完全“断开”。我正在运行调试构建优化已关闭。我还检查过pNodes与某些全局变量或其他更高范围的变量不对应 - 似乎只有本地版本。
这对我来说完全莫名其妙!我甚至不确定下一步要去找出问题所在。如果您有任何想法,我很乐意听到它们!
谢谢!
答案 0 :(得分:5)
所以我认为我已经破案了:罪魁祸首是结构成员对齐。我将一堆项目混合在一起,其中一些项目在项目中具有不同的值。我删除了所有这些设置,让VS选择默认设置,问题就消失了。
某些项目中的适用值介于 4字节之间,某些项目中默认,其他项目则完全清空。该值位于配置属性/ C / C ++ /代码生成/结构成员对齐下。同样,我最终只是删除了项目的值。我认为这是在过去的某些时候设置的项目,以处理某种跨平台问题,但至少它已经修复了我现在正在做的工作!
感谢您的所有帮助!
答案 1 :(得分:2)
如果使用不在范围内的变量设置监视,那就是我一直在使用Visual Studio看到的行为。它确实应该说“< not in scope>”或更有用的东西。
如果你正在逐步完成这些代码行,你仍然会看到那些幽灵般的值,我不知道:你确定它是一个调试版本吗?
答案 2 :(得分:-1)
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 放入观察窗口。
显然,观察窗口中显示的((或值)很重要。 如果你运行程序,你会看到,当它进入for循环时,手表会跟踪for循环的i变量。当它退出for循环,然后使用具有相同名称的另一个变量点击下面的代码时,监视窗口不跟踪该变量的内存。
你会看到手表窗口仍然声明我是10,即使在第二个循环中我现在是0,1,2,...并且在第二个循环后我实际上是6,但是观察窗口仍然声明我是10。
应该观察窗口吗?我认为,它应该始终显示带有该监视名称的变量的值,即 in scope ,因为语言规则告诉您在任何给定时间只有其中一个变量在范围内。
这是调试器监视窗口功能中的一个错误(VS2010似乎便宜地找到了函数中第一个与你在手表中给出它的名字相匹配的变量,并且不管其他什么东西都可能会看到这个内存空间在代码中,即使一个具有相同名称的新变量已经占用了范围(此时监视窗口现在对你说谎了!)