Windbg 从dump提取C#代码 电脑版发表于:2022/9/2 11:41  ># Windbg 从dump提取C#代码 [TOC] ## 抓dump包 tn2>首先我们的应用在服务器上出现问题时,我们可以通过`procdump`或者`procexp`提取文件。 这里我就使用`procdump`来抓取了。 首先以管理员的方式打开Powershell。 (<a target="_blank" href="https://docs.microsoft.com/zh-cn/sysinternals/downloads/procdump">关于安装请点击这里</a>)  tn2>创建`Inglass.PackagingMediaRepository.UploadJob`进程的Dump到D盘下。 ```bash procdump -ma Inglass.PackagingMediaRepository.UploadJob -i D:\ ``` tn2>更多关于procdump的参数请访问<a href="https://docs.microsoft.com/zh-cn/sysinternals/downloads/procdump">这里</a> ## 提取dump中的C#代码 tn2>首先打开Windbg,使用`lm`命令来获得image的base address.  tn2>然后我们通过`SaveModule`提取于此项目相关的代码。 ```bash !SaveModule 00db0000 D:\out.tmp ``` tn2>生成的out.tmp文件,我们通过ILSpy工具进行反汇编一下,但是只发现了几个文件的代码,并没有找到其他包的代码。  tn2>这时我们需要通过AppDomain来提取了。 ## AppDomain提取C#代码 tn2>我们知道 CLR 中 Assembly 是在名为 AppDomain 的逻辑空间中被载入运行的,而 AppDomain 是介于操作系统层面进程和线程概念之间,同时具有线程的轻便和进程的封闭性,使用者可以通过 AppDomain.CreateDomain 传见新的 AppDomain。 我们可以通过`EEHeap`命令,通过列出 CLR 执行引擎的堆信息,获取当前运行的 AppDomain 情况。 ```bash !EEHeap ```  tn2>我们可以看到CLR已经有了三个AppDomain:`System Domain`, `Shared Domain` 和 `Domain 1`。 然后我们通过如下命令来查看这三个域中有哪些引用的dll。 ```bash !DumpDomain /d 731875a8 !DumpDomain /d 73187258 !DumpDomain /d 0130aa50 ```  tn2>我们慢慢滚动,发现想要的包在Domain1下面,并且地址为`01115f40`.  tn2>接着我们通过SaveModule导出该dll的c#代码到D盘的out2.tmp文件中,并再次用ILSpy查看就有了。 ```bash !SaveModule 01115f40 D:\out2.tmp ```  