您现在的位置是:首页 > 技术文章网站首页技术文章

[Qt]程序奔溃前生成Dump定位调试

  • WangYe
  • 2021-05-16 10:11:41
  • 111 次阅读
生成EXE时候程序奔溃了定位调试方法

源码:

XXXX.pro

LIBS += -lDbgHelp    # 链接DbgHelp库
QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO    # Release 也生成 pdb
QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO

XXXX.cpp

/*生成 Dump 部分*/
#include <Windows.h>
#include <DbgHelp.h>
#include <QMessageBox>
#include <QTime>

LONG ApplicationCrashHandler(EXCEPTION_POINTERS *pException){//程式异常捕获
    /*
      ***保存数据代码***
    */
    //创建 Dump 文件
    QString str = QTime::currentTime().toString("HH时mm分ss秒zzz");
    std::wstring wlpstr = str.toStdWString()+L".dmp";
    LPCWSTR lpcwStr = wlpstr.c_str();
    qDebug()<<__FUNCTION__<<lpcwStr;
    HANDLE hDumpFile = CreateFile(lpcwStr,
                                  GENERIC_WRITE,
                                  0,
                                  NULL,
                                  CREATE_ALWAYS,
                                  FILE_ATTRIBUTE_NORMAL,
                                  NULL);
    if( hDumpFile != INVALID_HANDLE_VALUE){
        //Dump信息
        MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
        dumpInfo.ExceptionPointers = pException;
        dumpInfo.ThreadId = GetCurrentThreadId();
        dumpInfo.ClientPointers = TRUE;
        //写入Dump文件内容
        MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);
        qDebug()<<__FUNCTION__<<"write dump success";
        CloseHandle( hDumpFile );
        hDumpFile = 0;
    }else{
        qDebug()<<__FUNCTION__<<"write dump fail";
    }
    return EXCEPTION_EXECUTE_HANDLER;
}

/*放置在 main.cpp*/
SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ApplicationCrashHandler);//注冊异常捕获函数

步骤:

    1.工程项目生成的 exe 和 pdb 为了演示我单独放置一个文件夹;

image.png

    程序就一个测试按钮 内容:

    qint32 *i = nullptr;
    *i = 0;

    2.点击按钮后生成 23时34分21秒615.dmp 文件;

    3.用 Visual Studio 打开 dmp 文件 选择 使用 仅限本机 进行调试  即可定位报错位置;

image.png

上一篇:[Qt]配置Android环境

下一篇:没有下一篇~

文章评论 (0)



Top