我在转储文件中有一个类似于下面的调用堆栈。我想在调用堆栈中找到我的代码,但我做不到。分析我的转储的起点是什么?我的程序的链接选项是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()发布于 2022-03-24 07:48:38
TL;DR:如果您重新throw;,调用堆栈将不会显示原始位置,而是显示堆栈和ntdll.dll!RcConsolidateFrames()上更高的位置。
您将在调用堆栈中找到一个未处理异常的ntdll.dll!RcConsolidateFrames(),而不是当代码使用catch(ANYTHING) + throw; 在x64二进制文件中时的实际位置。
您可以看到,如果您的catch和重新抛出,原来的调用堆栈已经解除,当您然后throw;它将重新抛出原来的异常,但调用堆栈信息现在是混乱的。
我对MSVC的观察是,任何throw;都会发生这种情况,而这些throw;都是未处理并导致转储文件的。具体地说:
catch(...)还是catch(cppTypeEx&),都无所谓。/EHsc或/EHa)还是SEH异常( /EHa),都不重要。底线:throw;会搞乱你的调用堆栈
https://stackoverflow.com/questions/33093439
复制相似问题