楔子

前面一篇研究了下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 国际」许可协议进行许可。

.Net CLR异常简析的更多相关文章

  1. 简析 .NET Core 构成体系

    简析 .NET Core 构成体系 Roslyn 编译器 RyuJIT 编译器 CoreCLR & CoreRT CoreFX(.NET Core Libraries) .NET Core 代 ...

  2. Java Annotation 及几个常用开源项目注解原理简析

    PDF 版: Java Annotation.pdf, PPT 版:Java Annotation.pptx, Keynote 版:Java Annotation.key 一.Annotation 示 ...

  3. [转载] Thrift原理简析(JAVA)

    转载自http://shift-alt-ctrl.iteye.com/blog/1987416 Apache Thrift是一个跨语言的服务框架,本质上为RPC,同时具有序列化.发序列化机制:当我们开 ...

  4. SpringMVC源码情操陶冶-DispatcherServlet类简析(一)

    阅读源码有利于陶冶情操,此文承接前文SpringMVC源码情操陶冶-DispatcherServlet父类简析 注意:springmvc初始化其他内容,其对应的配置文件已被加载至beanFactory ...

  5. SpringMVC源码情操陶冶-DispatcherServlet简析(二)

    承接前文SpringMVC源码情操陶冶-DispatcherServlet类简析(一),主要讲述初始化的操作,本文将简单介绍springmvc如何处理请求 DispatcherServlet#doDi ...

  6. Linux驱动之中断处理体系结构简析

    S3C2440中的中断处理最终是通过IRQ实现的,在Linux驱动之异常处理体系结构简析已经介绍了IRQ异常的处理过程,最终分析到了一个C函数asm_do_IRQ,接下来继续分析asm_do_IRQ, ...

  7. Linux 目录结构学习与简析 Part2

    linux目录结构学习与简析 by:授客 QQ:1033553122 ---------------接Part 1-------------- #1.查看CPU信息 #cat /proc/cpuinf ...

  8. 0002 - Spring MVC 拦截器源码简析:拦截器加载与执行

    1.概述 Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理.例如通过拦截器可以进行权限验证.记录请求信息的日 ...

  9. Android -- 多媒体播放之MediaPlayer使用内部实现简析

    Android -- MediaPlayer内部实现简析 在之前的博客中,已经介绍了使用MediaPlayer时要注意的内容.如今,这里就通过一个MediaPlayer代码实例,来进一步分析Media ...

随机推荐

  1. mysql 跨库事务XA

    前一段时间在工作中遇到了跨库事务问题,后来在网上查询了一下,现在做一下整理和总结. 1.首先要确保mysql开启XA事务支持 SHOW VARIABLES LIKE '%XA%' 如果innodb_s ...

  2. 项目应用丨Modbus转Profinet网关连接ABB变频器的现场应用记录

    本案例客户需求是将ABB变频器接入到Profinet网络中,使用设备为西门子1200PLC,ABB变频器以及小疆智控Modbus转profinet网关.1.首先打开西门子组态软件,新建一个项目. 2. ...

  3. Rust实战系列-基本语法

    本文是<Rust in action>学习总结系列的第二部分,更多内容请看已发布文章: 一.Rust实战系列-Rust介绍 " 主要介绍 Rust 的语法.基本类型和数据结构,通 ...

  4. 无情摆烂我竟是cv怪物第四周周末总结

    无情摆烂我竟是cv怪物第四周周末总结 函数重要参数补充 1.*args 星号代表接收未被位置形参接收的额外的位置实参,无论有多少位置实参*args都可以将它全部接受 def func(*args): ...

  5. Vue3中defineEmits、defineProps 是怎么做到不用引入就能直接用的

    最近正在将一个使用单文件组件的 Options API 的 Vue2 JavaScript 项目升级为 Vue3 typescript,并利用 Composition API 的优势. 比如,下面这种 ...

  6. LGV 引理——二维DAG上 n 点对不相交路径方案数

    文章目录 引入 简介 定义 引理 证明 例题 释疑 扩展 引入 有这样一个问题: 甲和乙在一张网格图上,初始位置 ( x 1 , y 1 ) , ( x 2 , y 2 ) (x_1,y_1),(x_ ...

  7. 教大家怎么看monaco-editor的官方文档

    最近业务中有用到浏览器在线编辑器,用的是monaco-editor,官网文档只在首页介绍了npm安装方式. 但其实还有另外一种<script>的引入方式,但是这种方式体现在API文档中,由 ...

  8. 【Oracle初学者】ORA-01034: ORACLE not available

    系统报错代码 ORA-01034: ORACLE not available 出现原因 //在启动实例时,关闭了数据库,导致外部软件无法访问Oracle数据库(大部分都是因为数据库监听或者服务关闭导致 ...

  9. KingbaseESV8R3对于order by null列的处理

    背景 客户遇到一个现象order by 列是null的时候,最后一行总是显示相同的值.不要问我为什么对空值排序,意义何在?客户代码如此,客户不愿意改代码,作为dba大家都懂的.客户认为即使对null排 ...

  10. QT学习(五)----360界面制作(2终结)

    继续上一章的360新特性界面.源代码:http://download.csdn.net/detail/zhangyang1990828/5241242 上一章中实现了整个界面的纯UI设计,这次我们让它 ...