首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ntdll.dll!RcConsolidateFrames是什么?

ntdll.dll!RcConsolidateFrames是什么?
EN

Stack Overflow用户
提问于 2015-10-13 03:06:05
回答 1查看 1.6K关注 0票数 4

我在转储文件中有一个类似于下面的调用堆栈。我想在调用堆栈中找到我的代码,但我做不到。分析我的转储的起点是什么?我的程序的链接选项是release/Od。

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

发布于 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&),都无所谓。
  • 无论是C++异常( /EHsc/EHa)还是SEH异常( /EHa),都不重要。
  • 它在调试器和转储文件中都是这样的。

底线:throw;会搞乱你的调用堆栈

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33093439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档