为什么我的执行结果是正确的,但观察列表结果是错误的?

时间:2011-06-09 06:46:44

标签: c++ visual-studio debugging watch

我写了一个c ++程序,当我使用调试模式时, 我将一个指针类型变量(比如m_pdummy)放入监视列表中,但它显示“bad ptr”;

如果我展开这个指针(通过单击名称左边的“+”)并想要在此指针下看到其他变量,则所有变量都显示“表达式无法评估”;

然而,在我的代码中,我写了一些输出内容,例如:
CString str;
DWORD d1;
d1 = m_pdummy->m_wgear;
str.Format("%d");
MessageBox(str);
然后消息框显示正确的值;

但如果我将m_pdummy,d1,str拖到监视列表中,他们都会说“表达式无法评估”或“符号未找到”;但这是不可能的,因为消息框可以显示值;

那么这里有什么问题?!

最好的问候,阅读本文, 谢谢!

马森

2 个答案:

答案 0 :(得分:1)

可能是你在错误的堆栈框架中。您列出的那些变量仅根据其存储持续时间而存在。如果你 那个持续时间(例如,在输入他们的功能之前或离开之后),该变量就不存在了。

示例,假设你有这个功能(左边的行号):

20
21    int dbl (int x) {
22        int y = x + x + x;
23        y -= x;
24        return y;
25    }
26

x的持续时间仅限21行至25(且y2225)。任何在该持续时间之外观察变量的尝试都可能会导致您看到的消息。

对于对象也是如此,除非已实例化对象,否则您将无法看到成员变量。

另一种可能性是,即使对象已经实例化,您也可能需要全名,例如myObject->m_pDummy

他们根据有限的可用信息进行猜测,但这是我要研究的第一件事。

答案 1 :(得分:0)

也许您正在调试的代码不是正在运行的代码,或者VS Compiler优化您的代码,因此某些代码不再存在。
  在前者的情况下,无法监视断点和调试值,您应该检查与调试代码匹配的代码。当我向COM服务器注册一个'错误的'时,我想出了这个 对于后者,您应该关闭优化选项。希望这会对你有所帮助。