一、背景
相信有很多朋友在遇到应用程序各种奇葩问题后,拿下来一个dump文件,辛辛苦苦分析了大半天,终于在某一个线程的调用栈上找到了一个可疑的方法,但 www.58yuanyou.comwindbg 常常是以 汇编 的方式显示方法代码的,可惜的是,现如今的汇编,有多少像我们这些速成系码农还看的懂呢?
接下来尖锐的问题就来了,如何将这些汇编代码转成 C# 源代码,如果转不成源代码转成 IL代码也好呀,起码我努努力还是能试着看的懂的。
本篇我就来分享下如//www.58yuanyou.com何把 dump 中的方法源码提取出来。
二、从 dump 文件中提取源代码
1、案例演示
为了能够演示方便,我用 .netcore 3.1 写了一个简单的demo,代码如下:
namespaceConsoleApp6
{
classProgram
{
staticvoidMain( string[] args )
{
Run;
}
staticvwww.58yuanyou.comoidRun( )
{
Console.WriteLine( "hello world!");
Console.ReadLine;
}
}
}
将程序跑起来后,使用 任务管理器 , adplus , procdump 随便哪一个抓取 dump 都可以。
2、使用 lm + savemodule 命令提取
如果你的程序足够简单,可以直接用 lm 获取程序中所有的模块,然后使用 savemodule //www.58yuanyou.com将模块导出为 exe/dll 物理文件,如下所示:
使用 lm 提取出原由网所有模块
start end module name
000002c2` 264b0000 000002c2` 264b8000 ConsoleApp6_2c2264b0000 (deferred)
00007ff7`e4a50000 00007ff7` e4a7f000 ConsoleApp6( deferred)
00007ffa`a4b50000 00007ffa`a546d000 System_Private_CoreLib( deferred)
00007ffa`a5470000 00007ffa`a59df000 coreclr( deferred)
00007ffa`df070000 00007ffa`df1b2000 clrjit( deferred)
...
可以隐约的看到,我有一个名为 ConsoleApp6_2c2264b0000 的模块,这就是我要提取的 ConsoleApp6.exe ,顺便提一下,那个很碍眼的 ConsoleApp6 (deferred) 是 PE 文件,要问我怎么知道的?试一下就好啦