楔子

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

最新文章

  1. The Myths about Transactions (ACID) and NoSQL
  2. PHP数组
  3. [Android UI] shape和selector的结合使用
  4. 利用php的序列化和反序列化来做简单的数据本地存储
  5. CSS3中样式顺序
  6. C#反射(二) 【转】
  7. Java中的系统时间
  8. 私人订制——属于你自己的Linux
  9. VS2015 生成事件 命令参数
  10. LeetCode 46 全排列
  11. SD从零开始65 框架协议(Outline Agreement)
  12. sqlyog通过跳板机ssh连接mysql数据库
  13. 统计py文件中的代码行
  14. 集合05_Collections工具类
  15. HTML编辑笔记1
  16. 【DBCP】DBCP基本配置和重连配置+spring中配置
  17. Disconf 学习系列之全网最详细的最新稳定Disconf 搭建部署(基于Ubuntu14.04 / 16.04)(图文详解)
  18. spring boot 知识点1
  19. Python:PyCharm如何导入模块
  20. Eclipse 模拟http 请求插件Rest Client

热门文章

  1. 使用 for 循环 打印 9X9乘法表
  2. 恭喜社区喜提三枚新 Committer!
  3. 【深入学习.Net】.泛型集合【体检管理系统】
  4. (原创)【MAUI】在窗口(页面)关闭后获取其返回值
  5. mybatisplus-sql注入器
  6. 洛谷P4135 作诗(不一样的分块)
  7. windows10/11高性能模式开启
  8. 【三维地图】开发攻略 —— 详解“GeoJSON”技术和应用场景
  9. JavaScript之数组常用API
  10. React报错之Rendered more hooks than during the previous render