Windows程序Dump收集

爱谁谁
发布: 2025-07-03 08:04:26
原创
408人浏览过

在之前的文章《windbg调试----windbg入门》中,我们介绍了windbg的基础知识。许多新手可能会疑惑,为什么需要使用像windbg这样抽象的工具进行调试,而不是直接使用visual studio呢?

这是因为客户的环境千差万别,发布的软件在本地测试无法重现的问题时有发生。我们不能在客户的环境中安装一个几十G的Visual Studio,因此通常会先通过Debug Log进行初步分析。然而,面对程序崩溃、死锁、内存泄漏等问题,仅靠Debug Log进行分析是非常困难的。此时,我们需要利用程序dump进行进一步分析。进程dump主要是将当前运行进程的状态保存到一个文件中,包含进程相关的信息,如当前函数调用栈、堆、线程运行时间等。本文将介绍几种收集dump的工具及其使用场景。

使用Windows任务管理器生成Dump是一种简单的方法。当发现程序出现Memory Leak或死锁时,可以直接生成Dump。打开Windows任务管理器,右键需要生成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:

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_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug注册表下。

如果想关闭Windbg作为JIT调试器,可以通过删除注册表HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger。

当程序Crash时,会自动弹出Windbg并附加到程序,可以直接在Windbg窗口中输入以下命令获取full dump:

.dump /ma C:\dumps\full.dmp
登录后复制

程序运行时生成Dump,可以直接使用Windbg附加到需要生成Dump的进程,然后运行以下命令:

.dump /ma C:\dumps\running.dmp
登录后复制

Crash时直接生成Dump的方法结合了上述方法,具有以下优点:无需指定程序,只要系统中有程序Crash就会生成Dump。利用Windbg安装包中的ntsd(cdb也同样可以)。方法如下:

添加或修改注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug下的Debugger(REG_SZ类型):"" -noio -p %ld -e %ld -g -c ".dump /ma /u D:\dumps\dump.dmp; q"。表示当有程序Crash时,利用ntsd生成dump到路径D:\dumps,dump文件名中包含时间和进程名称,避免不同进程dump文件覆盖问题。添加或修改注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug下的Auto(REG_SZ类型):1。

以上就是Windows程序Dump收集的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号