【发布时间】:2011-11-08 18:39:06
【问题描述】:
我遇到了一个非常奇怪的问题,其中某些变量的监视窗口值似乎与它们的“真实世界”值不匹配。调试器似乎在空间中关闭。这是显示它的最小代码sn-p:
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,这似乎与代码“流动”的方式一致(即确实如此不在if语句中调用continue。
我什至可以检查&pNodes(nNode].nColumn 的内存,内存显示监视窗口显示的“不正确”值。因此,调试器似乎与实际程序数据或其他东西完全“断开连接”。我正在运行调试构建优化已关闭。我还检查了 pNodes 与某个全局变量或范围更高的其他变量不对应——似乎只有一个本地版本。
这对我来说完全莫名其妙!我什至不确定下一步该去哪里试图找出问题所在。如果您有任何想法,我很乐意听到!
谢谢!
【问题讨论】:
-
我注意到 Visual Studio 有时似乎会与手表中的数组混淆,并显示第一个对象的成员。
-
您确定您没有调试发布版本吗?如果你
printfnNode和&pNodes[nNode]的值,它们是否与调试器所说的一致? -
@Adam Rosenfield 是的,绝对是调试版本。不,
printf值确实不与调试器监视值一致。我试图在第五点表达这一点。调试器监视值与程序正在使用的“实际”值不一致。 -
如果你放置一个断点并尝试在中间窗口(不是监视变量)中计算表达式,它会说什么?
标签: c++ c visual-studio-2010 debugging watch