一、Windows系统的任务管理器里抓dump
启动任务管理器,选中某个进程,右键,弹出菜单"创建转储文件"
注意事项:
当你在64位Windows系统上抓32位进程的dmup文件时,如果用的是64位任务管理器,那么在用Windbg加载后,要用!wow64exts.sw切换到X86模式下,如果不想做这步切换,就要用32位的任务管理器来生成dmp文件。32位任务管理器在C:\Windows\SysWOW64\Taskmgr.exe
适合的场景:在任务管理器里还能看到进程,当程序出现业务问题、性能问题、失去响应;当程序崩溃跳出系统错误提示框的时候,特别适合应用在客户机出现上述问题时使用。因为我们不用传其他工具到客户机上。
二、用Windbg来抓取
2.1、方法一:启动windbg ,附加到我们关心的进程,执行命令 .dump [/ma/mdi] [存放路径]
适合的场景:在任务管理器里还能看到进程,当程序出现业务问题、性能问题、失去响应;当程序崩溃跳出系统错误提示框的时候,适合在公司内部测试时开发人员和测试人员使用
2.2、方法二 监视特定进程,当某进程崩溃时自动抓取dump
先运行可能存在问题的程序,然后执行命令在命令行里 执行 ..\WinDbg\adplus.vbs(exe) -crash -pn qq.exe -o c:\1.dmp。运行此命令后,WinDbg会跳出黑色窗口,用于监控进程的运行状况,注意不要关闭这个窗口,否则Dump就抓不到了。在目标进程里执行业务操作,当崩溃后,Dump文件会保存在指定的输出路径里。
在指定的输出目录下生成如下目录
参数说明:
- -crash: 当程序挂掉的一刹那抓取Dump,这个参数只能抓到程序报错时的信息,如果程序不报错,则无法抓到Dump。
- -hang: 当开启WinDbg之后就开始抓取Dump,主要用于抓取程序异常,但程序未崩溃的情况,例如进程的CPU使用率100%。
- -pn:进程的PID或进程名,如果是进程名,会区分大小写。
- -o: Dump输出路径.
适合的场景:程序已经运行,但不知道什么时候会崩溃且不会有错误提示框的情况。
2.3、方法三 将Windbg设置为默认调试工具
首先,执行 在命令行Windbg.exe -I 设置为默认调试工具,会弹出Windbg窗口
点“确定”窗口消失,然后运行程序和操作,当程序崩溃时WibDbg窗口再次弹出来,在windbg 命令行执行命令.dump [/ma/mdi] [存放路径]
参数说明:
-I: 将WinDbg作为默认的调试工具,注意I必须为大写,小写无效。
适合的场景:不知道什么时候会崩溃。无需指定要抓取的进程或PID,也不要求设置环境时必须存在进程,只要任意程序崩溃后都可以抓到Dump。
三、修改注册表
@echo off
echo 正在启用Dump...
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps"
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /v DumpFolder /t REG_EXPAND_SZ /d "C:\CrashDump" /f
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /v DumpType /t REG_DWORD /d 2 /f
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /v DumpCount /t REG_DWORD /d 10 /f
echo Dump已经启用
pause
@echo on
将上述内存保存为*.bat,然后执行,就开始了自动抓dmp文件的功能,只要有程序崩溃,就会在指定的目录下生成。
键值说明:
名称:DumpCount
,类型:REG_DWORD
,最大保留Dump个数,默认为10.
名称:DumpType
,类型:REG_DWORD
,Dump类型(1-Mini dump, 2-Full dump),默认为1.
名称:DumpFolder
,类型:REG_EXPAND_SZ
,Dump文件保存的位置。
当不需要自动抓取时,可以将下面的内容
@echo off
echo 正在关闭Dump...
reg delete "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /f
echo Dump已经关闭
pause
@echo on
保存为bat执行,就不会在自动产生了
适合的场景:也是不知道什么时候程序会崩溃,也无法确定崩溃是否会重现,只要有崩溃就会被抓取,万无一失。
四、编程
直接使用Windows的API——MiniDumpWriteDump和SetHandleExceptionFilter。在我们自己的应用里使用这两个API来实现程序崩溃时自动产生dump文件,并且还可以实现自己的dump上传机制等,不过要注意如果某些库会导致我们程序的机制失效。
五、Process Explorer
这个也是要注意在64位机上抓32位进程的问题,跟任务管理一样处理
写在最后:当然还有更多的工具和方法,包括上面介绍的工具和方法,我们可以根据实际情况和需要灵活应用,抓取dmp文件来帮助我们调试定位问题