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

