现在的位置: 首页 > 综合 > 正文

windows程序中生成崩溃转储文件(.dmp)

2018年05月04日 ⁄ 综合 ⁄ 共 1024字 ⁄ 字号 评论关闭

提供给用户使用的程序如果崩溃,如果能生成相应的转储文件,那么很容易定位出错原因

对于自己编写的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打开即可跟踪到出问题的位置

抱歉!评论已关闭.