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验证过,如需下载,请点击如下链接: