Qt下使用DbgHelp和SetUnhandledExceptionFilter来获取Crash log/dump文件

来源:互联网 发布:分布式系统 云计算 编辑:程序博客网 时间:2024/05/20 07:52

第一步:在pro中链接Lib

LIBS += -lDbgHelp

第二步:在main源文件中添加

#include <windows.h>

第三步:在main源文件中创建回调函数:

LONG CreateCrashHandler(EXCEPTION_POINTERS *pException){    //创建 Dump 文件    QDateTime CurDTime = QDateTime::currentDateTime();    QString current_date = CurDTime.toString("yyyy_MM_dd_hh_mm_ss");    //dmp文件的命名    QString dumpText = "Dump_"+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));    HANDLE DumpHandle = CreateFile((LPCWSTR)dumpText.utf16(),             GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);    if(DumpHandle != INVALID_HANDLE_VALUE) {        MINIDUMP_EXCEPTION_INFORMATION dumpInfo;        dumpInfo.ExceptionPointers = pException;        dumpInfo.ThreadId = GetCurrentThreadId();        dumpInfo.ClientPointers = TRUE;        //将dump信息写入dmp文件        MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),DumpHandle, MiniDumpNormal, &dumpInfo, NULL, NULL);        CloseHandle(DumpHandle);    }    //创建消息提示    QMessageBox::warning(NULL,"Dump",QString("ErrorCode%1  ErrorAddr:%2  ErrorFlag:%3 ErrorPara:%4").arg(errCode).arg(errAddr).arg(errFlag).arg(errPara),        QMessageBox::Ok);    return EXCEPTION_EXECUTE_HANDLER;}

第四步:在main函数中添加注册dump回调函数

int main(int argc, char *argv[]){    QApplication a(argc, argv);    //获取系统编码    QTextCodec *codec = QTextCodec::codecForLocale();        QTextCodec::setCodecForLocale(QTextCodec::codecForLocale());    //注冊异常捕获函数    SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)CreateCrashHandler);    /***代码实现***/}

这样就可以实现crashlog的保持和警告窗口提示。

阅读全文
0 0
原创粉丝点击