在Visual Studio中,由于各种原因,在调试会话期间无法解析大多数对象和变量。这意味着我无法检查或观察对象或调用它们的函数,因此调试代码非常困难,因为我的大多数表达式都无法正常工作。将表达式添加到监视窗口时,我遇到的一些典型错误包括:
这些表达式通常涉及重载的运算符和/或模板类对象。
为什么会这样?你是如何解决它的?
答案 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)会成功