Qt 利用 dmp 文件进行调试

一,环境

windows+msvc2015+Qt 5.10

 

二,release 生成 pdb 文件

(1),D:\Qt\Qt5.10.1\5.10.1\msvc2015\mkspecs\common 

QMAKE_CFLAGS_RELEASE     = -O2 -MD -Zi
QMAKE_LFLAGS_RELEASE     = /INCREMENTAL:NO /DEBUG

(2) Qt pro文件

QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO

三, main 函数

#include 
#pragma comment(lib,"Dbghelp.lib")

long  __stdcall CrashInfocallback(_EXCEPTION_POINTERS *pexcp)
{
    //创建 Dump 文件
    HANDLE hDumpFile = ::CreateFile(
                L"MEMORY.DMP",
                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[])
{
    GlobalApplication app(argc, argv);
    ::SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)CrashInfocallback);

    //测试用
     int *p=nullptr;
     *p=100;
}

Qt 利用 dmp 文件进行调试_第1张图片

Qt 利用 dmp 文件进行调试_第2张图片

三,加载 dmp  和pdb 文件,定位问题

(1), 双击 dmp 文件,用vs 打开

Qt 利用 dmp 文件进行调试_第3张图片

(2),

Qt 利用 dmp 文件进行调试_第4张图片

(3), 点击  仅限本机 进行调试

Qt 利用 dmp 文件进行调试_第5张图片

(4),

Qt 利用 dmp 文件进行调试_第6张图片

备注:如果工程同时加载了 easyloggin++ 日志,则pro配置中需要 取消错误打印选项 ,否则不会生成dmp 文件,因为错误被这个库 捕获了 但是它还记录不了太多有用的信息

Qt 利用 dmp 文件进行调试_第7张图片

 

参考:https://www.pianshen.com/article/469258720/

https://blog.csdn.net/u014552102/article/details/82026592

https://www.cnblogs.com/FKdelphi/p/10731775.html

 

 

你可能感兴趣的:(Qt)