这是一个模糊的问题,因此我期待模糊(但希望有帮助)的答案。
我是 C++ 新手,在 Visual Studio 中进行调试,最让我沮丧的是如何解释调用堆栈...
所以我的问题具体是关于我在堆栈顶部看到的错误。这应该说明什么?有人建议代码中抛出异常导致堆栈损坏。这可以由调用堆栈中的 __FrameUnwindFilter(_EXCEPTION_POINTERS*...) 行指示。我该如何解释这里发生的事情?有太多的事情我可能不关心。除此之外,还有一条警告“下面的框架可能不正确和/或丢失”,这是什么意思?我根本不能相信这些台词?为什么首先要展示它?另外,为什么 dddddddd() 位于堆栈帧的底部?
请帮助我 - 我正在寻找有关如何解释堆栈的一般建议和技巧。
谢谢
济南大学
对于一个特定错误,我看到的是:
mscvcr90d.dll!_NMSG_WRITE(...) Line ###
mscvcr90d.dll!abort() Line ## + 0x7 bytes
mscvcr90d.dll!terminate() Line ###
mscvcr90d.dll!__FrameUnwindFilter(_EXCEPTION_POINTERS* ...) Line ####
mscvcr90d.dll!__FrameUnwindToState(EHRegistrationNode * ...) Line ###
mscvcr90d.dll!@_EH4_CallFilterFunc@8() + 0x12 bytes
ntdll.dll!7c9032a8()
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]
ntdll.dll!7c90327a()
ntdll.dll
ntdll.dll
kernel32.dll
kernel32.dll
kernel32.dll
Other Library
Other Library
FINALLY MY LIBRARY CODE HERE
END OF MY LIBRARY CODE
a whole bunch of other libraries here that I haven't heard of
dddddddd()
最佳答案
这里发生了一些事情。
首先是似乎确实抛出了 SEH 异常。这是由 FrameUnwindToFilter
调用指示的。很难简单地从调用堆栈中确切地说出发生了什么异常。如果您向下移动到该框架并查看参数,其中一个应该有异常代码。
第二项是“下面的帧可能不正确...”当您正在调试不存在符号的 native DLL 时,调试器会显示此消息。由于缺少符号, native 调试器很难(有时甚至是不可能)准确确定调用堆栈。它迫使它猜测,因此警告“可能是错误的”
可以通过加载相关 DLL 的符号来修复此问题。在本例中是 nt.dll 和 kernel32.dll。这些是 Microsoft 拥有的 DLL,其符号是公开可用的。以下 MDN 页面提供了有关如何在计算机上设置公共(public)符号的更多信息
关于c++ - 帮助在 Visual Studio 中调试 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6866215/