Windows平台上 根据DMP + PDB进行源码级定位到源代码中的位置

参考链接:https://blog.csdn.net/u014552102/article/details/82026592

Qt5.9.1 MSVC2015 Demo下载链接:链接:https://pan.baidu.com/s/1-ST0NRZVmIB7kyKeAt83Og 提取码:ghmk 

链接二:

Qt 发布的release项目需要在pro文件中添加,这样才带有调试信息

QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO

需要添加的头文件主要有:

#include 
#include 

Pro文件中需要添加的LIB有:

LIBS += -lDbghelp
LIBS += -luser32

程序crash触发回掉函数:

#include "mainwindow.h"
#include 
#include 
#include 
#include 

long  __stdcall CrashInfocallback(_EXCEPTION_POINTERS *pexcp)
{
    //创建 Dump 文件
    QString FileName__ = QDateTime::currentDateTime().toString("yyyyMMdd-hhmmss") + ".DMP"; //以crash时间 命名
    HANDLE hDumpFile = ::CreateFile(
        FileName__.toStdWString().c_str(),
        GENERIC_WRITE,
        0,
        NULL,
        CREATE_ALWAYS,
        FILE_ATTRIBUTE_NORMAL,
        NULL
    );
    if (hDumpFile != INVALID_HANDLE_VALUE)
    {
        //Dump信息
        MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
        dumpInfo.ExceptionPointers = pexcp;
        dumpInfo.ThreadId = GetCurrentThreadId();
        dumpInfo.ClientPointers = TRUE;
        //写入Dump文件内容
        ::MiniDumpWriteDump(
            GetCurrentProcess(),
            GetCurrentProcessId(),
            hDumpFile,
            MiniDumpNormal,
            &dumpInfo,
            NULL,
            NULL
        );
    }
    return 0;
}

main.cpp:

#include "mainwindow.h"
#include 
#include 
#include 
#include 

long  __stdcall CrashInfocallback(_EXCEPTION_POINTERS *pexcp)
{
    //创建 Dump 文件
    QString FileName__ = QDateTime::currentDateTime().toString("yyyyMMdd-hhmmss") + ".DMP"; //以crash时间 命名
    HANDLE hDumpFile = ::CreateFile(
        FileName__.toStdWString().c_str(),
        GENERIC_WRITE,
        0,
        NULL,
        CREATE_ALWAYS,
        FILE_ATTRIBUTE_NORMAL,
        NULL
    );
    if (hDumpFile != INVALID_HANDLE_VALUE)
    {
        //Dump信息
        MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
        dumpInfo.ExceptionPointers = pexcp;
        dumpInfo.ThreadId = GetCurrentThreadId();
        dumpInfo.ClientPointers = TRUE;
        //写入Dump文件内容
        ::MiniDumpWriteDump(
            GetCurrentProcess(),
            GetCurrentProcessId(),
            hDumpFile,
            MiniDumpNormal,
            &dumpInfo,
            NULL,
            NULL
        );
    }
    return 0;
}



int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    ::SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)CrashInfocallback);

    MainWindow w;
    w.show();

    return a.exec();
}

 

 

非常感谢前辈们!

你可能感兴趣的:(QT,C++,日常错误)