提供给用户使用的程序如果崩溃,如果能生成相应的转储文件,那么很容易定位出错原因
对于自己编写的win32程序,可以如下编写
__try
{
逻辑代码
...
}
__exception(ExceptionHandler(GetExceptionInformation()))
{
//log info
//::ExitProcess();
}
ExceptionHandler里面进行转储文件生成
unsigned long ExceptionHandler(LPEXCEPTION_POINTERS pExceptionPointers)
{
char szFile[MAX_PATH];
sprintf(szFile, "mydmp%d.dmp", exe_version); // 记录程序版本
HANDLE hDmpFile = ::CreateFile(szFile, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0)
MINIDUMP_EXEPTION_INFORMATION stInfo = {0};
stInfo.ThreadId = GetCurrentThreadId();
stInfo.ExceptionPointers = pExceptionPointers;
stInfo.ClientPointers = TRUE;
BOOL bOk = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &stInfo, NULL, NULL);
if(!bOK)
//logInfo
对于MFC程序,可以在程序初始化的时候,比如App::Instance()函数中,设置未处理异常处理函数:
LPTOP_LEVEL_EXCEPTION_FILTER __hTopLevelExceptionFilter; // 全局变量
__hTopLevelExceptionFilter = ::SetUnhandledExcewptionFilter(TopLevelExceptionHandler);
TopLevelExceptionHandler与ExceptionHandler处理方式类似
如果客户程序崩溃了,将收到的*.dmp文件与程序以及相应的符号文件放到一个目录中,直接用vs打开即可跟踪到出问题的位置