原总结注册表debug调试dump转储文件windbgprocdump

前言

今天,向大家介绍几种可以抓取应用程序转储文件的工具及基本使用方法。更详细的用法,请参考每个工具对应的帮助文档。如果你还不清楚什么是转储文件,不知道什么时候需要转储文件,请参考转储文件系列文章的第一篇 —— 转储文件知多少。


各种抓取转储文件的工具

有很多工具都可以抓取转储文件。我列举几个常用的工具并简单介绍使用方法。


  1. 任务管理器
    任务管理器是唾手可得的抓取转储文件的工具。按住 ​​Ctrl + Shift + Esc​​ 即可打开。打开任务管理器后,在需要转储的进程上​​右键​​ -> ​​创建转储文件(C)​​,即可自动保存转储文件到 ​​%tmp%​​ 目录下。
    你需要知道的 N 种抓取 dump 的工具_任务管理器
    提示: 创建成功后,会弹出对话框提示转储文件保存的位置。一般保存在系统临时目录下。在文件管理器地址栏输入 ​​%temp%​​ 即可快速打开临时目录,对 ​​%appdata%​​ 等其它目录同样有效。
    你需要知道的 N 种抓取 dump 的工具_任务管理器_02
  2. process explorer
    ​process explorer​​ 比系统自带的资源管理器更强大,之前写过一篇文章介绍怎么使用 process explorer 替换系统自带的资源管理器的文章。感兴趣的小伙伴儿可以看一看。打开 ​​process explorer​​,在需要转储的进程上,​​右键​​ -> ​​Create Dump​​ -> ​​Create Full Dump...​​ 就可以保存转储文件了。( ​​Create Minidump...​​ 抓取的信息少,但抓取的转储文件小,适合网络传输,请根据自己的需要选择)
    你需要知道的 N 种抓取 dump 的工具_帮助文档_03
  3. visual studio
    ​visual studio​​ 简称 ​​vs​​,大家应该对 ​​vs​​ 应该非常熟悉了,我就不多介绍了。打开 ​​vs​​,附加到需要转储的进程上,点击 ​​Break All​​ 按钮(或者按快捷键 ​​Ctrl + Alt + Break​​)暂停目标进程。然后点击 ​​Debug​​ -> ​​Save Dump As...​​ 就可以保存转储文件了。如果不暂停目标进程,​​Save Dump As...​​ 按钮是置灰的。


你需要知道的 N 种抓取 dump 的工具_任务管理器_04

使用 vs 抓取 dump 录屏


{%note info%}

提示: 可以使用 ​​Ctrl + Alt + P​​ 快速打开 ​​Attach to Process​​ 界面,选择要附加的进程。

{%endnote%}



windbg

​windbg​​ 是 ​​windows​​系统上非常强大的调试器,基本上我只用 ​​windbg​​ 分析转储文件。能分析转储文件,当然能保存转储文件了。打开 ​​windbg​​,附加到需要转储的进程上,执行 ​​.dump [Options] path/to/save/dump.dmp​

你需要知道的 N 种抓取 dump 的工具_任务管理器_05

可以使用 ​​.hh .dump​​ 查看 ​​.dump​​ 命令的帮助文档。其中的 ​​/m[MiniOptions]​​ 会直接影响生成的转储文件的内容和尺寸。我们有必要了解每个选项的意义。因为我实在是太懒了,就贴一张 ​​MSDN​​ 上的截图吧。
你需要知道的 N 种抓取 dump 的工具_任务管理器_06



{%note info%}

注意:

最好用 ​​32​​ 位的 ​​windbg​​ 附加到 ​​32​​ 位进程中,​​64​​位的 ​​windbg​​ 附加到 ​​64​​ 位进程中。如果用 ​​64​​ 位的 ​​windbg​​ 附加到 ​​32​​ 位进程后,直接执行​​.dump​​ 命令生成的转储文件会 “有问题”。

{%endnote%}


  1. procdump
    终于,要介绍我最喜欢的 ​​procdump​​ 了。​​procdump​​ 是我用过的最好用的抓取转储文件的工具了。强烈建议你也试试。这里只简单介绍一些基本用法,因为用法实在是太多了,要完整介绍的话恐怕单独写一篇文章都介绍不完,而且很多高级用法我也不熟悉,都是用到了再去查帮助文档。如果你想了解更多高级用法,请参考​​官方文档​​ 或《Windows Sysinternals 实战指南》中介绍 ​​procdump​​ 的章节。


  • 直接运行 ​​procdump​​查看用法。
    你需要知道的 N 种抓取 dump 的工具_任务管理器_07
  • 运行 ​​procdump -? -e​​ 查看使用范例。


你需要知道的 N 种抓取 dump 的工具_帮助文档_08

procdump 用例




为指定进程 ​​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​

{%note info%}

注意:
​-x​​选项必须在最后。​​-x​​ 后面必须跟着转储文件的保存路径。
{%endnote%}



​-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]​



监视进程的运行状态,不论是否发生异常,只要进程退出就创建转储文件。



{%note info%}

注意: 因为 ​​-w​​ 是用来等待尚未启动的进程的,所以不能与​​process_id​​一起使用。没启动的进程当然没有进程​​ID​​了。如果在一起使用,会报如下错误:​​The wait option requires the process be specified by name.​

{%endnote%}



每隔 ​​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 实战指南》。

你需要知道的 N 种抓取 dump 的工具_帮助文档_09



安装 ​​procdump​​ 为事后调试器(​​postmortem debugger​​),或者叫 ​​JIT​​ 调试器 (​​Just In Time Debugger​​)。

以管理员权限运行 ​​procdump -i​​ 可以注册 ​​procdump​​ 为事后调试器。注册的时候可以指定转储文件保存的路径,及转储选项。例如,​​procdump -mp -i e:\dumps\​​。

以管理员权限运行 ​​procdump -u​​ 可以解除注册。

{%note info%}
提示: 以管理员权限运行 ​​windbg -I​​ 可以设置 ​​windbg​​ 为事后调试器。注意:是大写的​​I​​,不是小写的 ​​i​​。后面会专门写一篇文章介绍 ​​Just In Time Debug​​ 相关的内容。
{%endnote%}


  • Much Much More ...

{%note info%}
说明:
​procdump​​ 官方文档中的 ​​Learn More​​ 一节中有 ​​Defrag Tools​​上的视频链接,非常值得一看。
​procdump​​ 的作者是 ​​Mark Russinovich​​ 和 ​​Andrew Richards​​。​​Andrew Richards​​ 是 ​​Defrag Tools​​的主持人之一。
{%endnote%}

这里是一份使用 ​​procdump​​ 的录屏,展示了上面介绍的几种用法,感兴趣的小伙伴可以看看。




  1. 其它工具
    讲道理,只要是调试器就应该提供保存转储文件的功能。比如, ​​cdb​​, ​​ntsd​​,令我感到意外的是 ​​x64dbg​​ 和 ​​ollydbg​​ 居然没有保存转储文件的功能?不过,这不影响这两个调试器的伟大!如果你自己写调试器的话,请一定要加上保存转储文件的功能。除了上文种提到的各种工具和调试器外,还有很多其它工具也可以保存转储文件。比如,​​DebugDia​​,​​AdPlus​​ ,​​gflags​​ 等。如果对哪个工具感兴趣,请自行研究。


总结


  • 有很多优秀的工具可以帮我们抓取转储文件,我认为最好用的非 procdump
    莫属。
  • JIT Debug
    非常有用,可以让我们在进程异常退出时收到通知,并做相应的处理。


参考资料


  • 《软件调试》
  • 《Windows Sysinternals 实战指南》
  • Microsoft Document : .dump (Create Dump File)
  • procdump