# 一、生成dump文件 生成dump文件有三种方式:**任务管理器生成**,**windbg抓取**,源码中**添加dump转储代码**。需要根据实际情况选择。 ## 任务管理器生成 在程序崩溃后,先不关闭程序,在任务管理器中找到该程序对应的进程。右键—>创建转储文件。此时会在默认的目录下创建出一个dump文件。 可以看出,此种方法只适用于程序崩溃但没有立即自行退出的情况。倘若程序故障后自行退出,则此方法就难以应用。不过,我们可以在注册表中添加信息已确保系统在程序崩溃后自行保存一个dump文件: > HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\WindowsError Reporting\LocalDumps ![DumpFileCreateByRegister](https://wangyuedong-img.oss-cn-beijing.aliyuncs.com/img/DumpFileCreateByRegister.jpg) 其中DumpType代表的含义是: > 0 = Create a custom dump > 1 = Mini dump > 2 = Full dump 一旦程序崩溃,系统会在C:\CrashDump下生成一个dump文件。 ## WinDbg抓取 程序运行崩溃后,先不关闭程序,将WinDbg附加到改进程上。执行命令:.dump –ma Test.dmp ,则会产生一个Test.dmp的转储文件。 ## 程序添加dump 通过**SetUnhandledExceptionFilter**设置捕获dump的入口,然后通过**MiniDumpWriteDump**生成dump文件。如下程序在程序异常时会自行转储一个名为Test.dmp的dump文件。 ```c++ #include #include #pragma comment(lib,"DbgHelp.lib") // 创建Dump文件 void CreateDumpFile(LPCWSTR lpstrDumpFilePathName, EXCEPTION_POINTERS *pException) { HANDLE hDumpFile = CreateFile(lpstrDumpFilePathName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); // Dump信息 MINIDUMP_EXCEPTION_INFORMATION dumpInfo; dumpInfo.ExceptionPointers = pException; dumpInfo.ThreadId = GetCurrentThreadId(); dumpInfo.ClientPointers = TRUE; // 写入Dump文件内容 MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL); CloseHandle(hDumpFile); } // 处理Unhandled Exception的回调函数 LONG ApplicationCrashHandler(EXCEPTION_POINTERS *pException) { CreateDumpFile(L"Test.dmp",pException); return EXCEPTION_EXECUTE_HANDLER; } void fun(int *p) { p[0]=0; } int main(int argc, char * argv[]) { //注册异常处理函数 SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ApplicationCrashHandler); fun(NULL); return 0; } ``` # 二、调试dump文件 ## VS调试 用VisualStudio打开dmp文件。测试时 dmp文件时本地产生的,因此VS会依据dmp文件自行找到exe,pdb和源代码的路径。因此直接点击调试,程序会出错代码行中断。 但若dmp文件是exe在另一台机器上产生的,则我们最好把exe,pdb,dmp放到同一文件夹下,必须保证pdb与出问题的exe是同一时间生成的,用VS打开dmp文件后还需要设置符号表文件路径和源代码路径: (1) 当把pdb文件与dmp文件放入同一目录下时,就不需设置其路径,否则需要设置 工具->选项->调试->符号: ![DumpFileVS](https://wangyuedong-img.oss-cn-beijing.aliyuncs.com/img/DumpFileVS.jpg) (2)还需设置源代码路径: 属性->调试源代码: ![DumpFileVSSource](https://wangyuedong-img.oss-cn-beijing.aliyuncs.com/img/DumpFileVSSource.jpg) ## WinDbg调试 上面的方法其实并不实用,我觉的最实用的还是WinDbg调试的方法最好。WinDbg可以直接在Windows商店下载安装。 (1)设置pdb路径:File->Symbol File Path (2)设置exe路径:File->Image File Path (3)设置源代码路径:File -> Source File Path(指sln所在目录) (4)打开dmp文件:File ->Open Crash Dump (5)执行命令 `!analyze –v`