debugging Visual Studio无法显示某些受监视的表达式

70gysomp  于 2023-02-09  发布在  其他
关注(0)|答案(6)|浏览(261)

在Visual Studio中,由于各种原因,我的大多数对象和变量在调试会话期间无法解析。这意味着我无法检查或监视对象或它们调用的函数,这使得调试代码变得极其困难,因为我的大多数表达式根本不起作用。向监 windows 口添加表达式时,我遇到的一些典型错误包括:

  • CXX 0019:错误:错误类型转换
  • CXX 0059:错误:左操作数是类而不是函数名
  • CXX 0058:错误:未找到重载运算符

这些表达式通常涉及重载的运算符和/或模板类对象。
为什么会这样,你怎么解决的?

d7v8vwbk

d7v8vwbk1#

您遇到的错误是由于调试器中的限制,并不像Daniel暗示的那样存在bug。
监 windows 口无法调用重载运算符。例如,如果您有std::vector<int> vecSomething,则无法将vecSomething[0]放入监 windows 口,因为std::vector<int>::operator[]是重载运算符。因此,对于对象向量,您无法在监 windows 口中执行vecObject[0].SomeMemberVariableOfObject。您可以编写vecObject._Myfirst[0].SomeMemberVariableOfObject。在Visual Studio的STL实现中,_Myfirst是指向第一个元素的向量的成员。
如果要将自己的变量和类型添加到监 windows 口中,请直接将监视添加到数据成员中。跟踪像member.memberStruct.ptrToObj->memberOfObj这样的指针链没有问题。
编辑:
实际上,Visual Studio可以调用"监视"窗口中的代码:http://geekswithblogs.net/sdorman/archive/2009/02/14/visual-studio-2008-debugging-ndash-the-watch-window.aspx
因此,为什么不能使用重载运算符有点神秘。

jhdbpxl9

jhdbpxl92#

为什么会这样呢?
这个工具有它的局限性。例如,很多时候我"转到定义",却找不到定义。我不得不"在文件中查找"。在调试会话期间,一些表达式也没有计算,这并不奇怪。
你要怎么修?

  • 保持表达式简单。不要直接连接它们,使用带有解释性名称的变量作为中间结果。
  • 用显式Assert支持你的代码。如果Assert是"错误的",那么Assert应该失败。
sc4hvdpw

sc4hvdpw3#

Microsoft Documentation中详细描述了该问题和可能的解决方法
调试器接受大多数Microsoft和ANSI C/C表达式;但是,您需要注意以下几点:
不支持的运算符和附加运算符
对本机C
表达式的限制

amrnrhlw

amrnrhlw4#

我找到了一个解决方案,它(在某种程度上)解决了重载运算符的问题,它似乎不依赖于类的内部结构,你必须使用运算符调用的扩展形式,下面是vector<int> v的一个例子:

v.operator[](0)

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

yx2lnoni

yx2lnoni5#

PDB文件管理远非完美,尤其是在大型项目中。特别是,VS有一个相当愚蠢的行为,即合并VSxx.PDB中的所有符号,甚至跨不同的项目。/Fd开关可以很容易地解决这个问题;传递$(TargetDir)$(TargetName).pdb或类似的函数。

cfh9epnr

cfh9epnr6#

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

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

类似于(B *)(0x12345678)的强制转换将失败,但(A::B *)(0x12345678)将成功

相关问题