MFC程序,一旦崩溃,没有任何记录的话,将无法定位问题,因此有必要加入一些控制,来输出错误信息。
- 加入头文件以及库
#include <DbgHelp.h>
#pragma comment(lib, "dbghelp.lib")
- 定义错误处理函数
LONG __stdcall ExceptCallBack(EXCEPTION_POINTERS *pExcPointer)
{
MessageBox(NULL, _T("不知道为什么,程序崩溃了,请把同路径下的crash.dmp文件发给开发者!"), NULL, MB_OK);
//创建dump文件
TCHAR path[MAX_PATH];
GetCurrentDirectory(MAX_PATH, path);
CString p;
p.Format(_T("%s/crash.dmp"),path);
HANDLE hFile = CreateFile(p, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
//向文件写下当前程序崩溃相关信息
MINIDUMP_EXCEPTION_INFORMATION loExceptionInfo;
loExceptionInfo.ExceptionPointers = pExcPointer;
loExceptionInfo.ThreadId = GetCurrentThreadId();
loExceptionInfo.ClientPointers = TRUE;
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &loExceptionInfo, NULL, NULL);
CloseHandle(hFile);
return EXCEPTION_EXECUTE_HANDLER;
}
- 在程序入口添加错误回调函数
BOOL CAutoTestApp::InitInstance(){
SetUnhandledExceptionFilter(ExceptCallBack);
.
.
.
}
- 这样每次崩溃,在程序运行的同级目录会有一个crash.dmp文件,使用vs或windbg打开可以定位问题,当然,前提是你有同一批次编译出来的pdb文件。