让Windows下的应用程序在崩溃的时候写dump文件的代码
2016-01-25 00:41
477 查看
#pragma once #include "shared/util.h" #include <DbgHelp.h> #include "util/user.h" BOOL CALLBACK MyMiniDumpCallback(PVOID, const PMINIDUMP_CALLBACK_INPUT input, PMINIDUMP_CALLBACK_OUTPUT output) { if(input == NULL || output == NULL) return FALSE; BOOL ret = FALSE; switch(input->CallbackType) { case IncludeModuleCallback: case IncludeThreadCallback: case ThreadCallback: case ThreadExCallback: ret = TRUE; break; case ModuleCallback: { if( !(output->ModuleWriteFlags & ModuleReferencedByMemory) ) { output->ModuleWriteFlags &= ~ModuleWriteModule; } ret = TRUE; } break; default: break; } return ret; } void WriteDump(EXCEPTION_POINTERS* exp, const std::wstring &path) { HANDLE h = ::CreateFile(path.c_str(), GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); MINIDUMP_EXCEPTION_INFORMATION info; info.ThreadId = ::GetCurrentThreadId(); info.ExceptionPointers = exp; info.ClientPointers = NULL; MINIDUMP_CALLBACK_INFORMATION mci; mci.CallbackRoutine = (MINIDUMP_CALLBACK_ROUTINE)MyMiniDumpCallback; mci.CallbackParam = 0; MINIDUMP_TYPE mdt = (MINIDUMP_TYPE)(MiniDumpWithIndirectlyReferencedMemory | MiniDumpScanMemory); MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), h, mdt, &info, NULL, &mci); ::CloseHandle(h); } LONG WINAPI MyUnhandledExceptionFilter(EXCEPTION_POINTERS* exp) { nbase::Time::TimeStruct qt = nbase::Time::Now().ToTimeStruct(true); std::wstring file = nbase::StringPrintf(L"%04d%02d%02d_%02d%02d%02d.dmp", qt.year_, qt.month_, qt.day_of_month_, qt.hour_, qt.minute_, qt.second_); std::wstring dir = QPath::GetNimAppDataDir(); dir.append(file); WriteDump(exp, dir); std::wstring cmd = nbase::StringPrintf(L" /%s %s ", kCmdAppCrash.c_str(), dir.c_str()); QCommand::RestartApp(cmd); return EXCEPTION_EXECUTE_HANDLER; }
::SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
详细原理见博客中的软件崩溃的callback和writedump文章
同时link的时候需要link Dbghelp.lib这个lib文件
相关文章推荐
- Java DataInputStream和DataOutputStream 使用例子
- 2013年第四届蓝桥杯C/C++程序设计本科B组省赛
- 使用hexo和github pages搭建个人博客
- 2013年第四届蓝桥杯C/C++程序设计本科B组省赛 连号区间数(编程大题)
- Java23种设计模式(1):单例模式
- 2013年第四届蓝桥杯C/C++程序设计本科B组省赛 带分数(编程大题)
- Java并发——ReentrantLock类源码阅读
- Google C++编程风格指南(二)之函数的相关规范
- Google C++编程风格指南(二)之函数的相关规范
- 2013年第四届蓝桥杯C/C++程序设计本科B组省赛 翻硬币(编程大题)
- 2013年第四届蓝桥杯C/C++程序设计本科B组省赛 错误票据(编程大题)
- 2013年第四届蓝桥杯C/C++程序设计本科B组省赛 三部排序(代码填空)
- 2013年第四届蓝桥杯C/C++程序设计本科B组省赛 前缀判断(代码填空)
- 2013年第四届蓝桥杯C/C++程序设计本科B组省赛 黄金连分数(结果填空)
- 2013年第四届蓝桥杯C/C++程序设计本科B组省赛 第39级台阶(结果填空)
- 2013年第四届蓝桥杯C/C++程序设计本科B组省赛 马虎的算式(结果填空)
- 2013年第四届蓝桥杯C/C++程序设计本科B组省赛 高斯日记(结果填空)
- 浅谈C++引用与指针
- 2014年第五届蓝桥杯C/C++程序设计本科B组省赛
- 2014年第五届蓝桥杯C/C++程序设计本科B组省赛 小朋友排队(编程大题)