我的转储文件中有一个如下所示的调用堆栈。
我想在调用堆栈中找到我的代码,但找不到。
分析我的转储的起点是什么?
我的程序的链接选项是release/Od。
msvcr120.dll!abort()
msvcr120.dll!terminate()
msvcp120.dll!_Call_func$catch()
msvcr120.dll!_CallSettingFrame()
msvcr120.dll!__CxxCallCatchBlock(_EXCEPTION_RECORD * pExcept=0x0000002885f9b010)
ntdll.dll!RcConsolidateFrames()
msvcp120.dll!_Call_func(void * _Data=0x00000028835d5ce0)
msvcr120.dll!_callthreadstartex()
msvcr120.dll!_threadstartex(void * ptd=0x000000288366e410)
kernel32.dll!BaseThreadInitThunk()
ntdll.dll!RtlUserThreadStart()
TL;DR: 如果你是-throw;
调用堆栈不会显示原始位置,而是显示堆栈上方的内容ntdll.dll!RcConsolidateFrames()
.
你会找到ntdll.dll!RcConsolidateFrames()
在调用堆栈中查找未处理的异常,而不是代码使用时的实际位置catch(ANYTHING) + throw;
在 x64 二进制文件中 http://www.nynaeve.net/?p=110.
你看,如果你catch
并重新抛出,原始调用堆栈已经解开,然后当你throw;
它会重新抛出原来的异常,但调用堆栈信息现在混乱了。
我对 MSVC 的观察是,任何情况下都会发生这种情况throw;
然后未处理并导致转储文件。具体来说:
- It does not不管你是否使用
catch(...)
or catch(cppTypeEx&)
- It does not不管它是否是 C++ 异常(带有
/EHsc
or /EHa
)或 SEH 异常(带有/EHa
).
- 在调试器中它看起来像这样as well就像在转储文件中一样。
底线:throw;
会弄乱你的调用堆栈
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)