在客户提供的环境中运行程序时发生崩溃,因为发生频率或者打印日志不够完善(事实上发生问题时总是发现日志记录的不够细,但是日志也不可能详细到每个函数,每个执行语句)又或者客户不允许在其机器安装调试软件,导致程序员不能收集到崩溃时的信息,然后只能依据现象用通读代码的方式去解决,效率非常底下。
如果可以将崩溃时的堆栈信息记录下来,将会给程序员追踪问题带来很大的帮助。
通过dmp文件方式记录,步骤如下:
1 包含头文件
#include <dbghelp.h>
2 包含lib文件
#pragma comment(lib, "DbgHelp")
3 编写记录堆栈信息的函数
LONG WINAPI myExceptionFilter(struct _EXCEPTION_POINTERS* ExceptionInfo)
{
HANDLE lhDumpFile = CreateFile( "test.dmp", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL ,NULL);
MINIDUMP_EXCEPTION_INFORMATION loExceptionInfo;
loExceptionInfo.ExceptionPointers = ExceptionInfo;
loExceptionInfo.ThreadId = GetCurrentThreadId();
loExceptionInfo.ClientPointers = TRUE;
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),lhDumpFile, MiniDumpNormal, &loExceptionInfo, NULL, NULL);
CloseHandle(lhDumpFile);
return EXCEPTION_EXECUTE_HANDLER;
}
SetUnhandledExceptionFilter( myExceptionFilter );