在之前的文章《windbg调试—-windbg入门》中,我们介绍了windbg的基础知识。许多新手可能会疑惑,为什么需要使用像windbg这样抽象的工具进行调试,而不是直接使用visual studio呢?
这是因为客户的环境千差万别,发布的软件在本地测试无法重现的问题时有发生。我们不能在客户的环境中安装一个几十G的Visual Studio,因此通常会先通过Debug Log进行初步分析。然而,面对程序崩溃、死锁、内存泄漏等问题,仅靠Debug Log进行分析是非常困难的。此时,我们需要利用程序dump进行进一步分析。进程dump主要是将当前运行进程的状态保存到一个文件中,包含进程相关的信息,如当前函数调用栈、堆、线程运行时间等。本文将介绍几种收集dump的工具及其使用场景。
使用Windows任务管理器生成Dump是一种简单的方法。当发现程序出现Memory Leak或死锁时,可以直接生成Dump。打开Windows任务管理器,右键需要生成dump的进程,选择创建转存文件。

adplus是Windows调试工具集中的一个工具,安装了WDK或Windbg后可以在安装目录中找到。现在许多操作系统都是64位的,但有时Crash的程序可能是32位的,有时可能是64位的。因此,建议使用与程序位数匹配的adplus版本。
要获取Crash情况下的Dump,可以使用以下命令:
adplus -crash -FullOnFirst -o C:dumps -pmn test.exe
上述命令表示获取test.exe在Crash时的Full的First Chance和Second Chance的dump,并将其存放到C:dumps目录(需提前创建该目录)。如果有多个名为test.exe的进程,最好使用-p直接指定需要获取dump的唯一进程。
要获取程序未响应时的Dump,可以使用以下命令:
adplus -hang -FullOnFirst -o C:dumps -pmn test.exe
我测试过,即使程序正常运行时,也可以使用此命令直接获取Dump。这样可以分析dump,查看程序运行时的状态,例如检查死锁问题。
使用procdump可以避免安装adplus时需要安装Windbg或WDK的不便,可以直接从微软Sysinternals下载。
当然,也可以指定进程ID来获取dump。在进程启动过程中或启动后不久就Crash的情况下,Adplus不适用,因为它需要进程启动后才能使用。此时可以使用procdump的以下命令,等待test.exe启动后抓取dump:
集简云
软件集成平台,快速建立企业自动化与智能化
22 查看详情
procdump -ma -e test.exe C:dumps
使用Windbg生成Dump是我最喜欢的方式,因为Windbg几乎可以抓取所有场景下的dump,包括运行时、Crash时、hang等。
Windbg JIT调试生成Dump时,JIT(Just in Time)调试通常指的是及时调试。如果将Windbg设置为JIT调试器,当程序出现Crash时,将自动弹出Windbg并附加到程序的异常位置。使用提升后的管理员权限,运行以下命令:
windbg -I
实际上,Windbg的这个命令就是设置了Windows的注册表项,在HKEY_LOCAL_MACHINESOFTWAREWow6432NodeMicrosoftWindows NTCurrentVersionAeDebug注册表下。
如果想关闭Windbg作为JIT调试器,可以通过删除注册表HKEY_LOCAL_MACHINESOFTWAREWow6432NodeMicrosoftWindows NTCurrentVersionAeDebugDebugger。
当程序Crash时,会自动弹出Windbg并附加到程序,可以直接在Windbg窗口中输入以下命令获取full dump:
.dump /ma C:dumpsfull.dmp
程序运行时生成Dump,可以直接使用Windbg附加到需要生成Dump的进程,然后运行以下命令:
.dump /ma C:dumpsrunning.dmp
Crash时直接生成Dump的方法结合了上述方法,具有以下优点:无需指定程序,只要系统中有程序Crash就会生成Dump。利用Windbg安装包中的ntsd(cdb也同样可以)。方法如下:
添加或修改注册表HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionAeDebug下的Debugger(REG_SZ类型):"" -noio -p %ld -e %ld -g -c ".dump /ma /u D:dumpsdump.dmp; q"。表示当有程序Crash时,利用ntsd生成dump到路径D:dumps,dump文件名中包含时间和进程名称,避免不同进程dump文件覆盖问题。添加或修改注册表HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionAeDebug下的Auto(REG_SZ类型):1。
以上就是Windows程序Dump收集的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/451013.html
微信扫一扫
支付宝扫一扫