Visual Studio无法显示一些监视的表达式

时间:2009-11-24 08:38:05

标签: c++ visual-studio debugging expression

在Visual Studio中,由于各种原因,在调试会话期间无法解析大多数对象和变量。这意味着我无法检查或观察对象或调用它们的函数,因此调试代码非常困难,因为我的大多数表达式都无法正常工作。将表达式添加到监视窗口时,我遇到的一些典型错误包括:

  • CXX0019:错误:输入错误
  • CXX0059:错误:左操作数是类而不是函数名称
  • CXX0058:错误:未找到重载的运算符

这些表达式通常涉及重载的运算符和/或模板类对象。

为什么会这样?你是如何解决它的?

6 个答案:

答案 0 :(得分:8)

您遇到的错误是由于调试器的限制造成的,但Daniel并不存在错误。

监视窗口无法调用重载的运算符。 如果您有例如std::vector<int> vecSomething您无法将vecSomething[0]放入观察窗口,因为std::vector<int>::operator[]是一个重载的运算符。因此,对于对象矢量,您无法在监视窗口中执行vecObject[0].SomeMemberVariableOfObject。你可以写vecObject._Myfirst[0].SomeMemberVariableOfObject。在Visual Studio的STL实现中,_Myfirst是指向第一个元素的向量的成员。

如果您将自己的变量和类型添加到监视窗口,请直接向数据成员添加监视。遵循像member.memberStruct.ptrToObj->memberOfObj这样的指针链是没有问题的。

编辑:

实际上Visual Studio可以在Watch窗口中调用代码: http://geekswithblogs.net/sdorman/archive/2009/02/14/visual-studio-2008-debugging-ndash-the-watch-window.aspx

因此,为什么不能使用重载运算符有点神秘。

答案 1 :(得分:4)

  

为什么会这样?

该工具有其局限性。例如,很多次我“去定义”并没有找到定义。我必须“找到文件”。毫无疑问,在调试会话期间不会评估某些表达式。

  

你如何解决?

  • 保持表达简单。不要 直接连接它们,使用 具有解释性名称的变量 中间结果。
  • 使用显式断言支持您的代码。如果它是“错误的”,断言应该失败。

答案 2 :(得分:4)

问题和可能的解决方法在此Microsoft Documentation

中有详细描述
  

调试器接受大多数Microsoft和ANSI C / C ++表达式;但是,您需要注意以下事项:

     

不支持的运营商和其他运营商

     

对Native C ++表达式的限制

答案 3 :(得分:2)

PDB文件管理远非完美,当然在较大的项目中。特别是,VS具有相当愚蠢的行为,即在不同的项目中合并VSxx.PDB中的所有符号。 / Fd开关可以轻松解决这个问题;通过$(TargetDir)$(TargetName).pdb或类似的东西。

答案 4 :(得分:2)

我找到了一个解决方案(在某种程度上)解决了重载运算符的问题。它似乎不依赖于班级的内部。您必须使用扩展形式的操作员调用。以下是vector<int> v的示例:

v.operator[](0)

我在Visual C ++ 2012中测试过它。

答案 5 :(得分:1)

这可能是由于嵌套类
示例:

    class A
    {
        class B
        {
            int i;
        };
    };

像(B *)(0x12345678)一样会失败,但是(A :: B *)(0x12345678)会成功