.Net CLR异常简析

乎语百科 317 0

楔子

前面一篇研究了下C++异常的,这篇来看下,CLR的异常内存模型,实际上都是一个模型,承继自windows异常处理机制。不同的是,有VC编译器(vcruntime.dll)接管的部分,被CLR里面的函数ProcessCLRException接管了。 注意:这里面省略了一部分不必要赘述的细节问题,版本号分别为(CLR PreView 7和vcruntime 14.0)

C++异常栈

vcruntime140_1d.dll!__FrameHandler4::CxxCallCatchBlock
(jmp rdx)ntdll.dll!RcConsolidateFrames
ntdll.dll!RtlRestoreContext
ntdll.dll!RtlGuardRestoreContext
ntdll.dll!RtlUnwindEx
vcruntime140_1d.dll!__FrameHandler4::UnwindNestedFrames
vcruntime140_1d.dll!CatchIt
vcruntime140_1d.dll!FindHandler
vcruntime140_1d.dll!__InternalCxxFrameHandler
vcruntime140_1d.dll!__CxxFrameHandler4
ntdll.dll!RtlpExecuteHandlerForException()
ntdll.dll!RtlDispatchException
ntdll.dll!KiUserExceptionDispatch()
KernelBase.dll!RaiseException()
vcruntime140d.dll!_CxxThrowException
ConsoleApplication2.exe!main

CLR异常栈

>	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-》_CxxThrowException 2.RaiseTheExceptionInternalOnly和RaiseTheExceptionInternalOnly以及RaiseException-》RaiseException() 3.KiUserExceptionDispatch-》KiUserExceptionDispatch() 4.RtlDispatchException-》RtlDispatchException 5.RtlpExecuteHandlerForException》RtlpExecuteHandlerForException6.ProcessCLRException -》__CxxFrameHandler4

注意粗体部分对应的,这个地方开始,VC和CLR分道扬镳了。各自实现了后面函数异常处理的实现。

结尾

这里面实现包含了大量的细节,本文只取其中比较重要部分叙述下。

标签: # .net

留言评论

  • 这篇文章还没有收到评论,赶紧来抢沙发吧~