前言:在我们开发windows程序时(比如C#,qt,c++等),尤其是用到非托管代码时,经常会莫名其妙的发生程序闪退crash,但是脱离了ide时,又不知道crash原因,本文介绍如何抓取dump文件并进行调用堆栈分析
一、修改注册表
1、在注册表中,关闭AeDebug系统级的日志抓取(这里演示64位的路径,32位的注册表路径在其他地方):
2、新建一个.bat批处理文件并执行(有的电脑需要右键管理员权限),目的是自动在注册表中加入我们待观察程序(比如:MyDemo0520.exe)的待观测节点:
SET DMPPATH=E:\test
ECHO 上述关键词设置dump文件自动导出路径,该路径会自动生成,包括文件夹
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\MyDemo0520.exe" /f
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\MyDemo0520.exe" /t REG_SZ /v DumpFolder /d %DMPPATH% /f
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\MyDemo0520.exe" /t REG_DWORD /v DumpCount /d 2 /f
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\MyDemo0520.exe" /t REG_DWORD /v DumpType /d 1 /f
ECHO 启用完成
PAUSE
(DumpCount:最多保留几个dump文件;DumpType :0:自定义;1:miniDump;2:fullDump)
注:若有的电脑注册表中默认没有LocalDumps路径,则可以先手动去新建一个该LocalDumps项,再执行上述bat批处理文件
3、上述2步操作完,要使注册表生效,可以重启电脑。也可以使用导出再导入的方式(注意,这种操作一定要选中最小单元的节点,不要把整个父文件夹给覆盖了)
二、开启Windows Error Reporting Service的服务(默认为手动,改为自动)
三、测试打开要观察的exe程序,复现crash,此时E:\test文件夹下会生成需要的dmp文件:
(需要说明的时,若是在IDE调试发生的crash,一般不会生成dmp,直接被IDE拦截了,这里更适用直接运行exe的场景,尤其是debug模式)
打开winDbg程序,将dmp文件拖进来:
(windbg是在安装visualStudio2022自带的分析程序,也可以单独安装)