C++开发的应用程序崩溃时生成Dump文件分析(附Demo)
1. Dump文件介绍
Dump 文件是进程的内存镜像 , 可以把程序的执行状态通过调试器保存到dump文件中 ; Dump 文件是用来给驱动程序编写人员调试驱动程序用的 , 这种文件必须用专用工具软件打开 , 比如使用 WinDbg , VisualStudio打开;
当我们的程序发布出去之后 , 在客户机上是无法跟踪自己代码的 BUG 的 , 所以 Dump 文件对于我们来说特别有用 ; 我们可以通过 .dmp 文件把出现 BUG 的情况再现 , 然后再现客户环境 (包括堆栈调用等情况) , 设置源码调试路径 , 可以找到出现 BUG 的语句;
2. C++例子
用VS新建一个控制台项目DumpTest后,将如下代码拷贝到DumpTest.cpp中
// DumpTest.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "Windows.h" #include <direct.h> #include <string> using namespace std; #include "DbgHelp.h" #pragma comment(lib, ".\Lib\Dbghelp.lib") std::string current_working_directory() { char buff[250]; _getcwd(buff, 250); std::string current_working_directory(buff); return current_working_directory; } LONG WINAPI ExpFilter(struct _EXCEPTION_POINTERS *pExpInfo) { string sAppDirectory = ::current_working_directory(); string sDumpDirectory; SYSTEMTIME tm; GetLocalTime(&tm); char pszText[512] = {0}; sprintf_s(pszText, "\_Err%d%02d%02d%02d%02d%02d_.dmp", tm.wYear, tm.wMonth, tm.wDay, tm.wHour, tm.wMinute, tm.wSecond); sDumpDirectory = sAppDirectory + "\Crash"; CreateDirectory(sDumpDirectory.c_str(), NULL); string sDumpFile = sDumpDirectory + string(pszText); HANDLE hFile = CreateFile(sDumpFile.c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if(INVALID_HANDLE_VALUE != hFile) { MINIDUMP_EXCEPTION_INFORMATION einfo; einfo.ThreadId = GetCurrentThreadId(); einfo.ExceptionPointers = pExpInfo; einfo.ClientPointers = FALSE; MiniDumpWriteDump( GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &einfo, NULL, NULL); CloseHandle(hFile); } MessageBox(NULL, "软件即将停止工作,请将运行目录下Crash文件夹下的dmp文件发送给我们作进一步分析,谢谢。", "崩溃了", MB_OK|MB_ICONERROR); return EXCEPTION_EXECUTE_HANDLER; } int _tmain(int argc, _TCHAR* argv[]) { //crash后生成dmp文件机制 ::SetUnhandledExceptionFilter(ExpFilter); char *p = NULL; *p = 1; return 0; }
3. C++例子调试Dump文件
上述程序Release下编译后(为什么要Release呢,因为实际发布版本都是Release版本),会生成DumpTest.exe,点击该程序,会在Crash目录下产生一个dump文件比如:_Err20220630163217_.dmp
用VS打开该文件,并且设置路径(路径为刚才编译生成.pdb文件的路径):
设置完后点击“使用 仅限本机 进行调试”,效果如下:
上述代码在VS2010和VC6.0验证过,如需下载,请点击如下链接:
上一篇:
JS实现多线程数据分片下载
下一篇:
基于区块链的农产品溯源系统开发