天天看點

Qt開發: 捕獲系統異常,産生dmp檔案

項目 *.pro裡添加      
LIBS += -lDbgHelp      
main.cpp:      
#include "mainWidget.h"      
#include "MainForm.h"      
#include <QApplication>      
#include <QTextCodec>      
#include <QDir>      
#include <windows.h>      
#include <dbghelp.h>      
//異常捕獲函數      
long ApplicationCrashHandler(EXCEPTION_POINTERS *pException){      
{      
// 在程式exe的上級目錄中建立dmp檔案夾      
QDir *dmp = new QDir;      
bool exist = dmp->exists("../dmp/");      
if(exist == false)      
dmp->mkdir("../dmp/");      
}      
QDateTime current_date_time = QDateTime::currentDateTime();      
QString current_date = current_date_time.toString("yyyy_MM_dd_hh_mm_ss");      
QString time =  current_date + ".dmp";      
EXCEPTION_RECORD *record = pException->ExceptionRecord;      
QString errCode(QString::number(record->ExceptionCode, 16));      
QString errAddr(QString::number((uint)record->ExceptionAddress, 16));      
QString errFlag(QString::number(record->ExceptionFlags, 16));      
QString errPara(QString::number(record->NumberParameters, 16));      
qDebug()<<"errCode: "<<errCode;      
qDebug()<<"errAddr: "<<errAddr;      
qDebug()<<"errFlag: "<<errFlag;      
qDebug()<<"errPara: "<<errPara;      
HANDLE hDumpFile = CreateFile((LPCWSTR)QString("../dmp/" + time).utf16(),      
GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);      
if(hDumpFile != INVALID_HANDLE_VALUE) {      
MINIDUMP_EXCEPTION_INFORMATION dumpInfo;      
dumpInfo.ExceptionPointers = pException;      
dumpInfo.ThreadId = GetCurrentThreadId();      
dumpInfo.ClientPointers = TRUE;      
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);      
CloseHandle(hDumpFile);      
}      
else{      
qDebug()<<"hDumpFile == null";      
}      
return EXCEPTION_EXECUTE_HANDLER;      
}      
int main(int argc, char *argv[])      
{      
QApplication a(argc, argv);      
QTextCodec::setCodecForLocale(QTextCodec::codecForLocale());      
//注冊異常捕獲函數      
SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ApplicationCrashHandler);      
MainForm mf;      
mf.show();      
return a.exec();      
}      

繼續閱讀