【问题标题】:How come my execution result is correct, but watch list result is wrong?为什么我的执行结果是正确的,但监视列表结果是错误的?
【发布时间】:2011-09-11 10:56:13
【问题描述】:

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

如果我展开该指针(通过单击名称左侧的“+”)并想查看该指针下的其他变量,所有变量都显示“无法计算表达式”;

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

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

那么这里有什么问题?!

最好的问候谁读了这篇文章, 谢谢!

马森

【问题讨论】:

  • 您是否开启了优化?你确定你处于调试模式吗?
  • 是的,我处于调试模式,我使用 F10 运行下一步;优化会影响这些事情?!
  • 考虑(假设每个语句都有自己的一行):int foo(int x){ int y = x + 1; int z = y + 1; return z + 1; }。如果在优化时没有将其转换为int foo(int x){ return x + 3; },那么您将拥有一个非常愚蠢的编译器。现在考虑您开启了优化:没有yz
  • 酷,从来不知道!所以如果我打开了优化,那么如果我打开反汇编窗口并没有看到行 y=x+1 和 z=y+1 的汇编代码是正常的?
  • 是的。优化会重写您的代码,因此生成的汇编代码不再与您编写的完全匹配。但它仍然应该有相同的 result

标签: c++ visual-studio debugging watch


【解决方案1】:

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

【讨论】:

  • 我认为运行代码与编辑后的代码匹配,因为运行代码确实反映了我的更改;但唯一的问题是我看不到这个特定指针“m_pDummy”的正确值;非常奇怪的案例;感谢您的回复!
【解决方案2】:

可能是您在错误的堆栈帧中。您列出的那些变量仅根据它们的存储持续时间存在。如果您该持续时间之外(例如,在进入他们的函数之前或离开它之后),则该变量不存在。

例如,假设你有函数(左边的行号):

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

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

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

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

它们是基于有限的可用信息的猜测,但这是我首先要研究的东西。

【讨论】:

  • 您好,感谢您的快速回复!我会尝试全名方法;但我可以问一下“实例化”是什么意思吗?
  • ok 我遇到了更奇怪的情况,例如:我把 m_pDummy 放到监视列表中,当在第 21 行时,它显示值 1,执行到第 22 行,显示值 2,到第 23 行,另一个值;但是,在这些行中我没有对 m_pDummy 进行任何更改(包括对 m_pDummy 指向的变量的任何更改);
猜你喜欢
  • 2020-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-30
  • 1970-01-01
  • 2016-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多