楔子前面一篇研究了下C++異常的,這篇來看下,CLR的異常內存模型,實際上都是一個模型,承繼自windows異常處理機制 。不同的是,有VC編譯器(vcruntime.dll)接管的部分,被CLR里面的函數ProcessCLRException接管了 。注意:這里面省略了一部分不必要贅述的細節問題,版本號分別為(CLR PreView 7和vcruntime 14.0)
C++異常棧【.Net CLR異常簡析】vcruntime140_1d.dll!__FrameHandler4::CxxCallCatchBlock(jmp rdx)ntdll.dll!RcConsolidateFramesntdll.dll!RtlRestoreContextntdll.dll!RtlGuardRestoreContextntdll.dll!RtlUnwindExvcruntime140_1d.dll!__FrameHandler4::UnwindNestedFramesvcruntime140_1d.dll!CatchItvcruntime140_1d.dll!FindHandlervcruntime140_1d.dll!__InternalCxxFrameHandlervcruntime140_1d.dll!__CxxFrameHandler4ntdll.dll!RtlpExecuteHandlerForException()ntdll.dll!RtlDispatchExceptionntdll.dll!KiUserExceptionDispatch()KernelBase.dll!RaiseException()vcruntime140d.dll!_CxxThrowExceptionConsoleApplication2.exe!mainCLR異常棧> coreclr.dll!ProcessCLRException C++ ntdll.dll!RtlpExecuteHandlerForException ntdll.dll!RtlDispatchException ntdll.dll!KiUserExceptionDispatch KernelBase.dll!RaiseException coreclr.dll!`RaiseTheExceptionInternalOnly'::`53'::__Body::Run coreclr.dll!RaiseTheExceptionInternalOnly coreclr.dll!IL_Throw 00007ffa6faf040c()對比CLR異常棧的地址00007ffa6faf040c()實際上就是C#的main函數入口 。對比的是C異常棧的函數入口main 。其它的一一對應(C# ----C++):1.IL_Throw-》_CxxThrowException2.RaiseTheExceptionInternalOnly和RaiseTheExceptionInternalOnly以及RaiseException-》RaiseException()3.KiUserExceptionDispatch-》KiUserExceptionDispatch()4.RtlDispatchException-》RtlDispatchException5.RtlpExecuteHandlerForException》RtlpExecuteHandlerForException6.ProcessCLRException -》__CxxFrameHandler4
注意粗體部分對應的,這個地方開始,VC和CLR分道揚鑣了 。各自實現了后面函數異常處理的實現 。
結尾這里面實現包含了大量的細節,本文只取其中比較重要部分敘述下 。
經驗總結擴展閱讀
- 記一次 .NET 某電子病歷 CPU 爆高分析
- .NET 7 RC 2 發布,倒計時一個月發布正式版
- .NET MAUI 社區工具包 1.3版本發布
- windows C++ 異常調用棧簡析
- .NET平臺下一個你不知道的框架,我只想說兩個字:“牛逼”
- 2023三伏會不會異常高溫 三伏天不能做的六件事
- vivoz1激活手機顯示網絡連接異常
- .Net Framework中的AppDomain.AssemblyResolve事件的常見用法、問題,以及解決辦法
- OnionArch - 采用DDD+CQRS+.Net 7.0實現的洋蔥架構
- 記一次 .NET 某工控視覺軟件 非托管泄漏分析
