楔子前面一篇研究了下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平台下一个你不知道的框架,我只想说两个字:“牛逼”
- .Net Framework中的AppDomain.AssemblyResolve事件的常见用法、问题,以及解决办法
- OnionArch - 采用DDD+CQRS+.Net 7.0实现的洋葱架构
- 记一次 .NET 某工控视觉软件 非托管泄漏分析
- Bing 广告平台迁移到 .net6
- .NET 6 跨服务器联表查询