网站每个页面关键词都一样,网址大全qq浏览器,如何查询百度收录,seo搜索优化一、 生成Dump文件方式
1.1任务管理器
在程序崩溃后#xff0c;先不关闭程序#xff0c;在任务管理器中找到该程序对应的进程。右键—创建转储文件。 此时会在默认的目录下创建出一个dump文件。 可以看出#xff0c;此种方法只适用于程序崩溃但没有立即自行退出的情…一、 生成Dump文件方式
1.1任务管理器
在程序崩溃后先不关闭程序在任务管理器中找到该程序对应的进程。右键—创建转储文件。 此时会在默认的目录下创建出一个dump文件。 可以看出此种方法只适用于程序崩溃但没有立即自行退出的情况。倘若程序故障后自行退出则此方法就难以应用。不过我们可以在注册表中添加如下信息已确保系统在程序崩溃后自行保存一个dump文件
在注册表中找到
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\WindowsError Reporting\LocalDumps
添加项如下图 其中DumpType代表的含义是
0 Create a custom dump 1 Mini dump 2 Full dump
如此一来一旦程序崩溃系统会在C:\CrashDump下生成一个dump文件。
1.2WinDbg抓取
程序运行崩溃后先不关闭程序将WinDbg附加到改进程上。 执行命令.dump –ma Test.dmp 则会产生一个Test.dmp的转储文件。 1.3程序中加入存储Dump的代码
通过SetUnhandledExceptionFilter设置捕获dump的入口然后通过MiniDumpWriteDump生成dump文件。
如下程序在程序异常时会自行转储一个名为Test.dmp的dump文件。
[cpp] view plain copy
#includeWindows.h #includeDbgHelp.h #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(LTest.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文件
2.1VS调试
用VS打开dmp文件。测试时 dmp文件时本地产生的因此VS会依据dmp文件自行找到exepdb和源代码的路径。因此直接点击调试程序会出错代码行中断。 但若dmp文件是exe在另一台机器上产生的则我们最好把exe,pdb,dmp放到同一文件夹下必须保证pdb与出问题的exe是同一时间生成的用VS打开dmp文件后还需要设置符号表文件路径和源代码路径
1 当把pdb文件与dmp文件放入同一目录下时就不需设置其路径否则需要设置
工具-选项-调试-符号 2还需设置源代码路径
属性-调试源代码 这样点击“使用仅限本机进行调试”即可在出错代码行中断 2.2 WinDbg调试
(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 由分析结果可以看出在main.cpp第7行出错错误类型NULL_POINTER_WRITE.