如何从 dump 文件中提取出 C# 源代码?
一:背景
相信有很多朋友在遇到应用程序各种奇葩问题后,拿下来一个dump文件,辛辛苦苦分析了大半天,终于在某一个线程的调用栈上找到了一个可疑的方法,但 windbg 常常是以 汇编
的方式显示方法代码的,可惜的是,现如今的汇编,有多少像我们这些速成系码农还看的懂呢?
接下来尖锐的问题就来了,如何将这些汇编代码转成 C# 源代码,如果转不成源代码转成 IL代码也好呀,起码我努努力还是能试着看的懂的。。。
本篇我就来分享下如何把 dump 中的方法源码提取出来。
二: 从 dump 文件中提取源代码
1. 案例演示
为了能够演示方便,我用 .netcore 3.1 写了一个简单的demo,代码如下:
namespace ConsoleApp6
{
class Program
{
static void Main(string[] args)
{
Run();
}
static void Run()
{
Console.WriteLine("hello world!");
Console.ReadLine();
}
}
}
将程序跑起来后,使用 任务管理器
, adplus
, procdump
随便哪一个抓取 dump 都可以。
2. 使用 lm + savemodule 命令提取
如果你的程序足够简单,可以直接用 lm 获取程序中所有的模块,然后使用 savemodule 将模块导出为 exe/dll
物理文件,如下所示:
- 使用 lm 提取出所有模块
0:000> 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 文件,要问我怎么知道的? 试一下就好啦
- 使用 savemodule 提取
从上面第一行 start 列中可以看到 ConsoleApp6_2c2264b0000 的开始地址为 000002c2264b0000
,接下来用 savemodule 导出到 E:\dump
。
0:000> !savemodule 000002c2`264b0000 E:\dump\ConsoleApp6.exe
3 sections in file
section 0 - VA=2000, VASize=6c4, FileAddr=200, FileSize=800
section 1 - VA=4000, VASize=564, FileAddr=a00, FileSize=600
section 2 - VA=6000, VASize=c, FileAddr=1000, FileSize=200
然后就可以看到 E:\dump
里面多了一个 ConsoleApp6.exe
如何从 dump 文件中提取出 C# 源代码?的更多相关文章
- (转) 从ffmpeg中提取出YUV数据
有时需要从ffmpeg中提取出YUV数据用作预览,另存什么的. ffmpeg是先解码成YUV, 再以这个YUV作为输入进行编码,所以YUV数据有两种: 解码后的YUV数据, 以及 编码重建的YUV ...
- 从一段文字中提取出uri信息
package handle.groupby; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io ...
- 用正则怎么将html文件中文字取出进行ASCII码转换?
用正则怎么将html文件中文字取出?今天碰到这个问题,思来想去尝试了好几种方法,历经一阵头脑风暴,最后终于还是解决了,想想还是来记录一下.一共定义了三个函数,包含正则切割.正则判断对象开头.ASCII ...
- 从一个数组中提取出第start位到第end位
假设通过数组in来表示一个很大的数(in[0]表示最低bit),提取该数的第start位到第end位(计数起始位为0): #define MAX_BYTE_LEN ( 48 ) int getData ...
- [Spark][python]从 web log 中提取出 UserID 作为key 值,形成新的 RDD
针对RDD, 使用 keyBy 来构筑 key-line 对: [training@localhost ~]$ cat webs.log 56.31.230.188 - 90700 "GET ...
- jstack Dump 日志文件中的线程状态
[转]jstack Dump 日志文件中的线程状态 dump 文件里,值得关注的线程状态有: 死锁,Deadlock(重点关注) 执行中,Runnable 等待资源,Waiting on condi ...
- jstack Dump 日志文件中的线程状态(转)
jstack Dump 日志文件中的线程状态 dump 文件里,值得关注的线程状态有: 死锁,Deadlock(重点关注) 执行中,Runnable 等待资源,Waiting on conditio ...
- dump文件解析之探索.Net的内存
前言: 对于需要长时间运行的.net程序,有时需要我们查看内存的使用有没有内存泄露问题. 我们可以从dump文件中找到答案. Dump的看点 用dump文件来分析内存,到底我们需要关心哪些点呢? 内存 ...
- 利用VS2005进行dump文件调试
前言:利用drwtsn32或NTSD进行程序崩溃处理,都可以生成可用于调试的dmp格式文件.使用VS2005打开生成的DMP文件,能很方便的找出BUG所在位置.本文将讨论以下内容: 1. 程序编译选 ...
随机推荐
- css & multi line words & ellipsis
css & multi line words & ellipsis bug .news-card-content-title { width: 100%; height: 0.8rem ...
- js 在浏览器中使用 monaco editor
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- element-ui的树型结构图,半选状态数据给后台后,返回数据带有半选父节点的剔除展示
// html <h2 class="text-gray">功能权限</h2><el-tree :data="permissionList& ...
- 「NGK每日快讯」2021.1.5日NGK第63期官方快讯!
- NGK全球启动大会正式启动,资产上链的前景与机会在哪?
据彭博社报道,加州时间11月25日,NGK全球启动大会在美国硅谷圆满落幕,本次NGK全球启动大会为NGK全球化进程正式拉开了帷幕. 众多业界人士共襄盛举,共同进行探讨未来公链发展的去向和契机. 当前, ...
- 教你玩转CSS border(边框)
边框样式 边框样式属性指定要显示什么样的边界. border-style属性用来定义边框的样式 border-style的值 代码演示: <!DOCTYPE html> <html ...
- Flutter 中不得不会的 mixin
mixin 是 Dart 中非常重要的概念,对于未接触过此概念的Coder来说尤其重要,最近看源码的时候,由于对 mixin 不熟悉导致理解出现偏差,走了很多弯路,所以这篇文章介绍一下 mixin 概 ...
- H5跳转app代码
不罗嗦直接上代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- 配置JDK环境及其相关问题
1.首先找到JDK的安装目录 如果忘记了安装目录在那个地方,可以通过dos命令java -verbose,进行查看 配置jdk环境 新建系统变量JAVA_HOME: 编辑系统变量Path: 新建系统变 ...
- SpringBoot2.x整合Email并利用AOP做一个项目异常通知功能
因为不知aop能干嘛,因此用aop做个小功能,再结合最近学的springboot-Email做了个系统异常自动邮件通知的功能, 感觉满满的成就感. AOP不懂的可以看上一篇:https://www.c ...