首页 > 其他分享 >.Net CLR异常简析

.Net CLR异常简析

时间:2022-10-12 08:33:06浏览次数:81  
标签:__ ntdll dll 简析 vcruntime140 1d Net CLR

楔子

前面一篇研究了下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》RtlpExecuteHandlerForException
6.ProcessCLRException -》__CxxFrameHandler4

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

结尾

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

作者:江湖评谈
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
image

标签:__,ntdll,dll,简析,vcruntime140,1d,Net,CLR
From: https://www.cnblogs.com/tangyanzhi1111/p/16783243.html

相关文章

  • .NET 7 RC 2 发布,倒计时一个月发布正式版
    微软2022-10-12发布了.NET7RC2,下一站是.NET7正式发布,就在下个月NetConf2022(11月8日)期间正式发布。经过长达一年时间的开发,.NET7规划的所有主要的新功能都已推出......
  • CSharp: Chain of Responsibility Pattern in donet core 3
     ///<summary>///责任链模式ChainofResponsibilityPattern亦称:职责链模式、命令链、CoR、ChainofCommand、ChainofResponsibility///geovindu,......
  • 开箱即用~基于.NET Core的统一应用逻辑分层框架设计
    目前公司系统多个应用分层结构各不相同,给运维和未来的开发带来了巨大的成本,分层架构看似很简单,但保证整个研发中心都使用统一的分层架构就不容易了。那么如何保证整个研......
  • Netty学习之NIO基础
    Netty学习之NIO基础本博客是根据黑马程序员Netty实战学习时所做的笔记可先参考博客JavaNIO一、三大组件简介Channel与BufferJavaNIO系统的核心在于:通道(Channel)和......
  • Golang Kubenetes容器多集群平台开发实践
    前言  Go语言在基础服务开发领域优势     Go语言在高并发、通信交互复杂、重业务逻辑的分布式系统中非常适用,具有开发体验好、一定量级下服务稳定、性能满足需要......
  • Visualizing Deep Neural Network Decisions: Prediction Difference Analysis
    目录概本文方法代码ZintgrafL.M.,CohenT.S.,AdelT.andWellingM.Visualizingdeepneuralnetworkdecisions:predictiondifferenceanalysis.InInternati......
  • Netty 学习(十):ChannelPipeline源码说明
    Netty学习(十):ChannelPipeline源码说明作者:Grey原文地址:博客园:Netty学习(十):ChannelPipeline源码说明CSDN:Netty学习(十):ChannelPipeline源码说明ChannelPipeline可以看......
  • GNNExplainer: Generating Explanations for Graph Neural Networks
    目录概符号说明本文方法代码YingR.,BourgeoisD.,YouJ.,ZitnikM.andLeskovecJ.GNNExplainer:generatingexplanationsforgraphneuralnetworks.InAdvanc......
  • 简析 Linux 的 CPU 时间
    从CPU时间说起...下面这个是top命令的界面,相信大家应该都不陌生。top-19:01:38up91days,23:06,1user,loadaverage:0.00,0.01,0.05Tasks:151total,......
  • Kubernetes--创建Ingress资源
    创建Ingress资源Ingress资源是基于HTTP虚拟主机或URL的转发规则,它在资源配置清单的spec字段中嵌套了rules、backend和tls等字段进行定义。下面的示例中定义了一个Ingress......