Qt生成dump文件 vs协助定位 辅助开发(二)

一、环境配置
在这里插入图片描述
勾选红框中选项 重新编译工程 release版本即可产生pdb文件
在这里插入图片描述
二、dump文件生产代码

#ifndef QTDUMPGENERATE_H
#define QTDUMPGENERATE_H

#include <QObject>
#include <QDir>
#include <QDateTime>
#include <QDebug>
#include <QCoreApplication>

//注意下面2个头文件引入的顺序
#include <windows.h>
#include <dbghelp.h>

class QtDumpGenerate
{
public:
    QtDumpGenerate();
    void ApplicationCrashHandler(EXCEPTION_POINTERS *pException);
};

#endif // QTDUMPGENERATE_H

#include "qtdumpgenerate.h"

QtDumpGenerate::QtDumpGenerate()
{

}

void QtDumpGenerate::ApplicationCrashHandler(EXCEPTION_POINTERS *pException)
{
    QDateTime current_date_time = QDateTime::currentDateTime();
    QString current_date = current_date_time.toString("yyyy_MM_dd_hh_mm_ss");
    QString dmpFileName = QCoreApplication::applicationDirPath() + "/" +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(dmpFileName).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";
    }
}

long ApplicationCrashHandler(EXCEPTION_POINTERS *pException)
{
    QtDumpGenerate dmpGenerate;
    dmpGenerate.ApplicationCrashHandler(pException);
    return EXCEPTION_EXECUTE_HANDLER;
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ApplicationCrashHandler);
    int *p = nullptr;//make crash point
    *p = 1;
    init();
    return a.exec();
}

三、vs调试dump文件
在这里插入图片描述
在这里插入图片描述

发布了30 篇原创文章 · 获赞 1 · 访问量 1142

猜你喜欢

转载自blog.csdn.net/u010906468/article/details/104879857