探索 sscli, 开启 CLR 的大门 —— 配置环境详解(转)

本文分享了作者在CLR(公共语言运行时)研究过程中的经验与心得,介绍了使用SourceInsight进行代码分析的方法,以及如何利用WinDbg进行CLR调试,包括设置符号路径和常用调试命令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      以前我一直是做dotnet开发,对于整个clr的架构非常感兴趣。而且对整个运行环境也进行过一些分析与跟踪。在这里给希望研究 CLR 内部原理以及实现的用户一个建议:sscli 不等于 DotNet Framework,不等于CLR。在分析 sscli 更多的时候是参考其内部的数据结构和大体的代码流程而不是具体实现,如果你用WinDbg或是OllyDbg跟踪过CLR,你会发现 sscli 和你所看到的根本不相同。

配置及环境:
一.代码分析工具
      在 sscli 茫茫的代码中确实需要一个有效的分析工具,我这里选择的是Source Insight,它可以帮助你找到相关类型,并且有效的定位到代码的声明或实现的地方。
图1:新建一个项目,sscli,项目文件保存地点需要与你的 sscli 文件夹存放在同一个磁盘上


2.


3.选择sscli20中的CLR文件夹点击 AddTree 按钮,他会寻找到所有相关代码


4.进行文件同步,source insight就会同步所有代码文件。


3.分析后的代码


二.CLR调试工具
      WinDbg 利用微软提供的调试 symbol 你可以真实的跟踪出具体实现的函数以及类型(从这点你就可以发现 sscli 并不是微软的实现代码)。具体配置如下:

 1.设置symbol,我这里选择的 D:\WinSymbols 文件夹你可选择别的地方


2.加载dotnet程序进行调试,几个比较实用的命令 lm 列出所有加载的模块, ld 加载制定模块,例如:ld mscoree,列出指定模块symbol:x /n mscoree!*


之后就可以进行 CLR 的调试。如图:调用堆栈显示 CLR 的执行过程。


下面列表就是使用 x /n mscorjit! 命令列出 JIT 编译器实现的一部分接口(这里只粘贴了一部分):
// 获取即时编译对象
790a6082 mscorjit!getJit = <no type information>

790a60a0 mscorjit!CILJit::`vftable' = <no type information>
7906edef mscorjit!CILJit::clearCache = <no type information>
7906114f mscorjit!CILJit::compileMethod = <no type information>                    // 编译 IL 代码 (jit层源代码保护一般来说就是在这里实现的,详情请参看我以前写的文章,MaxToCode DNGuard HVM 都可以由此分析破解)
790610a0 mscorjit!CILJit::isCacheCleanupRequired = <no type information>


7908f1b2 mscorjit!Compiler::EHblkDsc::CheckIsInHandlerRegion = <no type information>
790867ff mscorjit!Compiler::EHblkDsc::CheckIsInTryRegion = <no type information>
79085d2e mscorjit!Compiler::EHblkDsc::IsInFilterRegion = <no type information>
790a5515 mscorjit!Compiler::EHblkDsc::IsInHandlerRegion = <no type information>
79066e44 mscorjit!Compiler::FlatFPAllocFPState = <no type information>
...
.....
.....
.....
7909af92 mscorjit!Compiler::verVerifyCall = <no type information>
7909bbf9 mscorjit!Compiler::verVerifyCond = <no type information>
7909ba31 mscorjit!Compiler::verVerifyField = <no type information>
790a086e mscorjit!Compiler::verVerifyLDIND = <no type information>
790a0805 mscorjit!Compiler::verVerifySTIND = <no type information>
7909aae3 mscorjit!Compiler::verVerifyThisPtrInitialised = <no type information>


以上仅仅是我经过一些分析的心得,在此与大家分享,希望大家踊跃拍砖 :>

 

转载于:https://www.cnblogs.com/zhaoyx/articles/2238436.html

源码简介:Microsoft 发布了 sscli 2.0,所谓的 sscli 就是 Shared Source CLI。基本上是 .NET Framework 2.0 的 Microsoft 实现,当然是实际发布的 .NET Framework 2.0 的一个简化版本。 sscli 2.0 中包含很多有趣的东西,包括: 01、vm - 包含了 CLI 核心实现,包括垃圾收集器、类装入器、类型系统、错误报告系统、应用程序域、配件、代理支持、反射、安全性和代码管理器。 02、csharp - 包含了使用 C++ 编写的 C# 编译器(csc.exe)和配件连接器。 03、classlibnative - 包含了公共类型和国际化例程。 04、ipcman - 包含跨进程通讯系统的源代码。 05、managedlibraries - 包含Remoting 和 SoapSerializer 的源代码。 06、utilcode - 包含被运行时、工具和 C# 编译器使用的核心例程,例如路径处理和分析、数组和散列表管理、C 运行库、字符大小写支持、库和配件载入、调试和日志支持、同步机制,还包括字符串格式化、GUID创建、错误处理、注册表以及配置访问等。 07、md - 包含元数据的读取器和编写器。 08、fjit - 包含 sscli JIT 编译器和验证器。 09、fusion - 包含配件绑定、策略检查和全局配件缓存的实现代码。 10、bcl - 包含 ECMA 基础类库的 C# 代码,包括大部分 System 名字空间下的代码。 11、debug - 包含运行时调试器的源代码。 12、ilasm - 包含 CIL 汇编器的源代码。 13、ildasm - 包含 CIL 反汇编器的源代码。 14、tools - 包含 PEVerify、clix.exe、metainfo.exe、托管调试器符号的读写器以及其它工具的源代码。 15、toolbox - 包含 caspol、strike 等其它工具的源代码。 16、dlls - 包含在构建过程中所需要的本机共享库。 17、xmlparser - 包含 XML 分析器的源代码。 18、fx - 包含主要名字空间中类的实现,包括正则表达式、XML和网络等。 19、jscript - 包含了使用 C# 编写的 JScript 编译器。 20、pal - 包含了平台适配层(PAL)的实现,包括 unix 和 win32 两个平台。 21、palrt - 包含 PAL 运行时的实现。 22、samples - 示例。 23、tests - 大量的测试用例和套件。
http://blog.youkuaiyun.com/atfield/article/details/1471465 Introduction Shared Source CLI 2.0 (开发代号Rotor) 是微软.NET Framework 2.0的Shared Source实现版本。Shared Source是微软推出的源代码共享计划,可以在一定限制的情况下获得/使用源代码,详情可以参考Microsoft Shared Source Initiative主页:http://www.microsoft.com/resources/sharedsource/。Rotor的代码可以在非商业行为的前提下可以自由修改和发布,只需保留License声明即可。Rotor包含了下面的内容: 1. CLI的运行时(CLR)的符合ECMA标准的实现 2. C# & Jscript编译器 3. .NET Framework中的部分工具,如ilasm, ildasm, cordbg, gacutil, sn等 4. Build工具,如Build, Binplace, NMake等 5. PAL (Platform Adaptation Layer),支持其他平台 6. 自动化回归测试 7. Samples 由此可见,Rotor是研究.NET Framework实现的最佳材料。 Rotor的全部源代码可以在微软的MSDN网站上下载:http://msdn.microsoft.com/net/sscli/ 下载后解压缩,可以看到如下的目录结构: 目录 内容 Binaries.x86*.rotor Build出来的可执行文件和Symbols。这个目录在Build之后才会出现 clr CLI和BCL(Base Class Library)的实现 csharp C#编译器的实现就在这里了 Docs 文档 Env Build时所需的一些文件 Fx 类库的实现 Jscript Jscript编译器的实现 Pal Platform Adaptation Layer的实现。PAL是Rotor对Windows和Unix的一些基本API的封装 Palrt Platform Adaptive Layer Runtime的实现。PAL中的和操作系统平台无关可重用的部分 prebuilt 存放着build所需的一些事先用工具生成好的文件 Samples Samples Tests Regression Test Suite Tools Build工具,包括binplace, build, cppmunge等 Vscommon 公共头文件,主要是微软内部使用的一些产品有关的公用的宏定义 总共大概有150MB左右。 本人先发在优快云上做个备份。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值