前言
今天,向大家介绍几种可以抓取应用程序转储文件的工具及基本使用方法。更详细的用法,请参考每个工具对应的帮助文档。如果你还不清楚什么是转储文件,不知道什么时候需要转储文件,请参考转储文件系列文章的第一篇 —— 转储文件知多少。
约定
下文中提到的异常,都是指未处理的异常。为了行文方便(其实是我懒,想少打几个字),用异常代替。
各种抓取转储文件的工具
有很多工具都可以抓取转储文件。我列举几个常用的工具并简单介绍使用方法。
-
任务管理器
任务管理器是唾手可得的抓取转储文件的工具。按住
即可打开。打开任务管理器后,在需要转储的进程上Ctrl + Shift + Esc
->右键
,即可自动保存转储文件到创建转储文件(C)
目录下。%tmp%
使用 taskmanager 抓取 dump 截图dump分析工具_你需要知道的 N 种抓取 dump 的工具
提示:
创建成功后,会弹出对话框提示转储文件保存的位置。一般保存在系统临时目录下。在文件管理器地址栏输入
即可快速打开临时目录,对
%temp%
等其它目录同样有效。
%appdata%
how-to-open-temp-folder
- process explorer
比系统自带的任务管理器更强大,之前写过一篇文章介绍使用 process explorer 替换任务管理器的文章。感兴趣的小伙伴儿可以看一看。打开process explorer
,在需要转储的进程上,process explorer
->右键
->Create Dump
就可以保存转储文件了。(Create Full Dump...
抓取的信息少,但抓取的转储文件小,适合网络传输,请根据自己的需要选择)Create Minidump...
使用 process explorer 抓取 dump 截图dump分析工具_你需要知道的 N 种抓取 dump 的工具
3. visual studio
visual studio
简称
vs
,大家应该对
vs
应该非常熟悉了,我就不多介绍了。打开
vs
,附加到需要转储的进程上,点击
Break All
按钮(或者按快捷键
Ctrl + Alt + Break
)暂停目标进程。然后点击
Debug
->
Save Dump As...
就可以保存转储文件了。如果不暂停目标进程,
Save Dump As...
按钮是置灰的。
使用 vs 抓取 dump 录屏
提示:
可以使用
快速打开
Ctrl + Alt + P
界面,选择要附加的进程。
Attach to Process
4. windbg
windbg
是
windows
系统上非常强大的调试器,基本上我只用
windbg
分析转储文件。能分析转储文件,当然能保存转储文件了。打开
windbg
,附加到需要转储的进程上,执行
.dump [Options] path/to/save/dump.dmp
使用 windbg 抓取 dump 录屏
可以使用
.hh .dump
查看
.dump
命令的帮助文档。其中的
/m[MiniOptions]
会直接影响生成的转储文件的内容和尺寸。我们有必要了解每个选项的意义。因为我实在是太懒了,就贴一张
MSDN
上的截图吧。
注意:
最好用
位的
32
附加
windbg
位进程,
32
位的
64
附加
windbg
位进程。如果用
64
位的
64
附加到
windbg
位进程后,直接执行
32
命令生成的转储文件会 “有问题”。
.dump
-
procdump
终于,要介绍我最喜欢的
了。procdump
是我用过的最好用的抓取转储文件的工具了。强烈建议你也试试。这里只简单介绍一些基本用法,因为用法实在是太多了,要完整介绍的话恐怕单独写一篇文章都介绍不完,而且很多高级用法我也不熟悉,都是用到了再去查帮助文档。如果你想了解更多高级用法,请参考官方文档[1] 或《Windows Sysinternals 实战指南》中介绍procdump
的章节。procdump
- 直接运行
查看用法。procdump
procdump 帮助dump分析工具_你需要知道的 N 种抓取 dump 的工具 - 运行
查看使用范例。procdump -? -e
procdump 用例dump分析工具_你需要知道的 N 种抓取 dump 的工具 - 为指定进程
的进程生成转储文件。ID
procdump [-mp] process_id [path/to/save/dump]
- 为指定进程名的进程生成转储文件(注意:如果系统中存在多个名为
的进程,会报错)process_name
procdump [-mp] process_name [path/to/save/dump]
-
-x
选项,启动一个新进程并监视。
启动的进程退出就保存转储文件。procdump -x path/to/save/dump process_to_start process_parameters
- 启动的进程有未处理的异常的时候才保存转储文件。
procdump -e -x path/to/save/dump process_to_start process_parameters
注意:选项必须在最后。
-x
后面必须跟着转储文件的保存路径。
-x
-
选项,等待进程启动。-w
是w
的缩写。需要与其它命令配合使用。wait
-
选项,监控进程的挂起状态。-h
是h
的缩写。hang
-
选项,监控进程的异常状态。-e
是e
的缩写。exception
-
选项,在进程终止时创建转储文件。-t
是t
terminate
的缩写。
一般情况下,我们只关心进程异常退出的情况,但有时候我们也关心进程正常退出的情况。这时候我们可以使用此选项,在进程退出的时候生成转储文件。不论进程是被强制终止的,还是由于异常退出的,还是正常退出的,统统没问题。
- 监视进程的运行状态并在进程发生异常的时候生成
。可以与dump
选项一起使用。-w
procdump [option] -e [-w] process_name or process_id [path/to/save/dump]
- 监视进程的运行状态并在进程挂起的时候生成
。可以与dump
选项一起使用。-w
procdump [option] -h [-w] process_name or process_id [path/to/save/dump]
- 监视进程的运行状态,不论是否发生异常,只要进程退出就创建转储文件。
注意:
因为
是用来等待尚未启动的进程的,所以不能与
-w
一起使用。没启动的进程当然没有进程
process_id
了。如果在一起使用,会报如下错误:
ID
The wait option requires the process be specified by name.
- 每隔
秒保存一次转储文件,一共保存5
次。3
procdump -s 5 -n 3 process_name or process_id [path/to/save/dump]
- 当进程
高于CPU 占用率
,并持续%10
的时候生成转储文件,最多生成2s
个。10
procdump -s 2 -n 10 -c 10 process_name or process_id [path/to/save/dump]
-
dump
文件名生成规则
如果我们没指定转储文件的名字,
会根据procdump
的规则生成。相信,细心的小伙伴已经从录屏里看出来了。这样我们就不用担心之前生成的转储文件被覆盖了。PROCESSNAME_YYMMDD_HHMMSS
-
-mp
选项
使用该选项可以大大的降低转储文件的大小。强烈建议启用此选项。具体工作原理,请参考《Windows Sysinternals 实战指南》。
-mp选项介绍 截自英文版dump分析工具_你需要知道的 N 种抓取 dump 的工具 - 安装
为事后调试器(procdump
),或者叫postmortem debugger
调试器 (JIT
Just In Time Debugger
)。
以管理员权限运行
可以注册procdump -i
为事后调试器。注册的时候可以指定转储文件保存的路径,及转储选项。例如,procdump
procdump -mp -i e:\dumps\
。
以管理员权限运行
可以解除注册。procdump -u
提示:
以管理员权限运行
可以设置
windbg -I
为事后调试器。注意:是大写的
windbg
,不是小写的
I
。后面会专门写一篇文章介绍
i
相关的内容。
Just In Time Debug
- Much Much More ...
你知道吗?官方文档中的
procdump
一节中有
Learn More
上的视频链接,非常值得一看。
Defrag Tools
的作者是
procdump
和
Mark Russinovich
。
Andrew Richards
是
Andrew Richards
的主持人之一。
Defrag Tools
这里是一份使用
procdump
的录屏,展示了上面介绍的几种用法,感兴趣的小伙伴可以点开看看。
procdump 用例示范
-
其它工具
讲道理,只要是调试器就应该提供保存转储文件的功能。比如,
,cdb
等。令我感到意外的是ntsd
和x64dbg
居然没有保存转储文件的功能?不过,这不影响这两个调试器的伟大!如果你自己写调试器的话,请一定要加上保存转储文件的功能。除了上文中提到的各种工具和调试器外,还有很多其它工具也可以保存转储文件。比如,ollydbg
,DebugDia
,AdPlus
等。如果对哪个工具感兴趣,请自行研究。gflags
总结
- 有很多优秀的工具可以帮我们抓取转储文件,我认为最好用的非
莫属。procdump
-
非常有用,可以让我们在进程异常退出时收到通知,并做相应的处理。JIT Debug
参考资料
- 《软件调试》
- 《Windows Sysinternals 实战指南》
- Microsoft Document : .dump (Create Dump File)[2]
- procdump[3]
References:
[1] 官方文档: https://docs.microsoft.com/en-us/sysinternals/downloads/procdump
[2] Microsoft Document : .dump (Create Dump File): https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/-dump--create-dump-file-
[3] procdump: https://docs.microsoft.com/en-us/sysinternals/downloads/procdump
猜你喜欢:
转储文件知多少
[原]调试实战——程序CPU占用率飙升,你知道如何快速定位吗?
[原]调试实战——使用windbg调试崩溃在ole32!CStdMarshal::DisconnectSrvIPIDs
[原]调试实战——崩溃在ComFriendlyWaitMtaThreadProc
[原]调试实战——调试PInvoke导致的内存破坏
[原]调试实战——调试excel启动时死锁
[原]调试实战——调试TerminateThread导致的死锁
[原]调试实战——调试DLL卸载时的死锁
[原]排错实战——拯救加载调试符号失败的IDA
[原]排错实战——使用process explorer替换任务管理器
[原]排错实战——VS清空最近打开的工程记录
[原]排错实战——解决Tekla通过.tsep安装插件失败的问题
[原]排错实战——你知道拖动窗口时只显示虚框怎么设置吗?
[原]排错实战——通过对比分析sysinternals事件修复程序功能异常
你知道怎么使用DebugView查看调试信息吗?
欢迎留言交流