【问题标题】:Problems watching non-trivial expressions in visual studio debugger在 Visual Studio 调试器中观看非平凡表达式时出现问题
【发布时间】:2011-09-21 12:02:56
【问题描述】:

基本上我的问题是我希望 Visual Studio (2010 Professional) 能够在监视窗口中评估它在我正在调试的代码中处理的任何 Visual C++ 表达式,但显然有一些东西阻止了这种情况的发生。例如,在处理 CStrings 时,在监视窗口中评估 CString 上的方法 IsEmpty 会给我一个 Member function not found 错误,基本的相等比较也是如此(在被调试的代码中显然没有问题)。

我在这里遗漏了什么,还是我要求的太多了?明显的解决方案是在我的代码中为我正在寻找的任何 CString 操作添加调试语句,但我不想这样做。

更新/示例:

CString blah = _T("blah");

在我的代码中调用 blah.IsEmpty() 可以正常工作,但在调试器的监视窗口中我收到上述错误 (CXX0052)。变量blah的内容可以在观察窗口看到。

【问题讨论】:

  • 对于您当前的项目或您创建的任何项目都失败了?你有什么版本的VS?您能否创建一个演示项目来重现该问题并在此处发布代码 sn-p 给您相同的警告?
  • 我正在 VS 2010 Professional 中处理多个 MFC 项目(上面已更新)。刚刚创建了一个新的 MFC 项目(示例 Microsoft 项目)来尝试一下;同样的问题。我将添加一个 sn-p。

标签: visual-studio debugging visual-c++


【解决方案1】:

我可以重现您的问题,而且确实,VS 监视窗口显示 Member function not found 以及错误代码 CXX0052

the MSDN documentation我发现这个问题是由于调用了一个内联函数,CString::IsEmpty()成员函数很可能是内联了(这是Watch Window评估器看到的),要解决问题,首先打开您的项目配置并禁用内联

其次,仍然在项目配置中,选择在静态库中使用 MFC(如果您将其用作共享库,不知何故,监视窗口会一直将调用的函数视为内联函数,也许这是因为在共享库中代码是内联的,并且监视窗口评估器不使用此类运行时库的调试版本)。

第三,清理并重建您的解决方案。

之后,应该在调试期间修复问题(如果您在监视面板中看到该值呈灰色显示,请记住刷新表达式)。请记住切换回原来的调试选项或更好,创建一个新的调试配置文件以保留此设置。

【讨论】:

  • 感谢您的详细回答,我按照您的步骤操作(由于设置在静态库中使用 MFC多线程 DLL,还必须添加 #define _AFXDLL 项目需要的标志(/MD)),能够编译,链接和运行,但不幸的是与以前的监视窗口评估器有相同的问题。我会再试一次和/或另一个项目。
  • 我在另一个项目中尝试了这个,相同的步骤,相同的结果。这两个项目都依赖其他DLL,第二个也是一个显然依赖另一个EXE文件运行的DLL。您认为我不需要使用更改的设置来构建其他 DLL 和 EXE,是吗?我正在调试更改后的二进制文件,并在各自的代码库中有断点,所以这无关紧要。但是我想还是可以尝试一下....
  • @newenglander 你能把那个项目贴在某个地方吗?这样我就可以下载它并使用配置来发现可能解决问题的遗漏参数。当然还有另一组选项可以摆脱CXX052 警告
  • 感谢您的提议,问题是该项目依赖于其他几个项目/DLL,因此要发送的内容很多。我必须请求许可才能分享这个。我可以看看我们是否有一个没有这么多依赖项的类似项目(或创建一个)。但我得等到下周,现在无法访问这些文件。
  • @newenglander 对不起,我以为这个项目是一个测试项目,你能告诉我(一步一步)如何重现你的一组项目的基本版本吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-09
  • 1970-01-01
  • 1970-01-01
  • 2012-02-25
  • 1970-01-01
  • 2010-10-18
相关资源
最近更新 更多