最近在一个后台程序调试的时候,经常死掉,尝试过写log,但还是很难定位。
想到了使用dumpfile来做保存崩溃信息方便调试定位错误。因为debug版本与release版本的优化差异,在release版本仍然难以定位到代码,只有在debug版本出现错误的时候,可以定位到代码。目前只有这种方法了,结合记录的log应该会有效。
#include <windows.h>
#include <dbghelp.h>
#pragma comment(lib,"dbghelp.lib")
// 创建Dump文件
//
void CreateCrashDumpFile(LPCWSTR lpstrDumpFilePathName, EXCEPTION_POINTERS *pException)
{
// 创建Dump文件
//
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)
{
TCHAR * Path = new TCHAR[MAX_PATH];
DWORD pathret = ::GetModuleFileName(NULL,Path,MAX_PATH);
TCHAR * chPos;
TCHAR * temp = Path;
while (*temp!=_T('\0'))
{
if (*temp==_T('\\'))
{
chPos = temp;
}
temp++;
}
*chPos = _T('\0');
_tcscat(Path,_T("\\crash.dmp"));
CreateCrashDumpFile(Path,pException);
FatalAppExit(0,Path);
delete []Path;
return EXCEPTION_EXECUTE_HANDLER;
}
int _tmain(int argc, _TCHAR* argv[])
{
// 设置处理Unhandled Exception的回调函数
//
SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ApplicationCrashHandler);
int i;
int j;
scanf("%d %d",&i,&j);
float k = i/j;
printf("the result is %lf\n",k);
system("pause");
return 0;
}