qt-- qtcreator创建dump文件并用vs2015定位程序中断位置

文章讲述了如何在MSVC环境下配置生成pdb文件,以便于调试。通过创建Qt项目和自定义的cusdump.h头文件,实现当程序异常时生成DMP文件。在VS中,即使没有pdb文件,也能通过DMP定位到出错位置。对于MingW,只能生成DMP文件,但在VS中可能无法准确定位。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用msvc编译器,因为mingw生成不了pdb文件,生成的话太麻烦,这里没有尝试。

试的时候,msvc debug模式下生成的dmp,不用pdb文件,VS也能定位到出错的地方;

mingw只能生成dmp,用VS打开后,不知道定位到哪里了。

做了一些修改,转载链接:qtcreator创建dump文件并用vs2015定位程序中断位置 - 掘金

  1. 新建一个qt项,取名TestDump

  2. 在.pro文件中添加如下代码,为了编译的时候能生成pdb文件
    #以下代码为生成pdb文件

     
    CONFIG += force_debug_info
    CONFIG += senarate_debug_info

  3. 新建一个cusdump.h头文件,代码如下:
     

    #ifndef CUSDUMP_H
    #define CUSDUMP_H
    #pragma once
    #include <tchar.h>
    #include <Windows.h>
    #include <DbgHelp.h>
    
    #pragma comment(lib, "user32.lib")
    
    int GenerateMiniDump(PEXCEPTION_POINTERS pExceptionPointers)
    {
        // 定义函数指针
        typedef BOOL(WINAPI * MiniDumpWriteDumpT)(
            HANDLE,
            DWORD,
            HANDLE,
            MINIDUMP_TYPE,
            PMINIDUMP_EXCEPTION_INFORMATION,
            PMINIDUMP_USER_STREAM_INFORMATION,
            PMINIDUMP_CALLBACK_INFORMATION
            );
        // 从 "DbgHelp.dll" 库中获取 "MiniDumpWriteDump" 函数
        MiniDumpWriteDumpT pfnMiniDumpWriteDump = NULL;
        HMODULE hDbgHelp = LoadLibrary(L"DbgHelp.dll");
        if (NULL == hDbgHelp)
        {
            return EXCEPTION_CONTINUE_EXECUTION;
        }
        pfnMiniDumpWriteDump = (MiniDumpWriteDumpT)GetProcAddress(hDbgHelp, "MiniDumpWriteDump");
    
        if (NULL == pfnMiniDumpWriteDump)
        {
            FreeLibrary(hDbgHelp);
            return EXCEPTION_CONTINUE_EXECUTION;
        }
        // 创建 dmp 文件件   
       //源程序这里用的是两个TCHAR,我不会用,改成了char,能生成文件,但是文件名 DumpFile这一半是乱码 删掉乱码,VS能打开dump文件
        //后来发现是少了一个  L 把"DumpFile"前面加上L就行了,中间不能有空格   所以又改回了TCHAR
        TCHAR szFileName[MAX_PATH] = { 0 };
        TCHAR szVersion[] = L"DumpFile";
        SYSTEMTIME stLocalTime;
        GetLocalTime(&stLocalTime);
        wsprintf((LPWSTR)szFileName, L"%s-%04d%02d%02d-%02d%02d%02d.dmp",
            szVersion, stLocalTime.wYear, stLocalTime.wMonth, stLocalTime.wDay,
            stLocalTime.wHour, stLocalTime.wMinute, stLocalTime.wSecond);
        HANDLE hDumpFile = CreateFile((LPCWSTR)szFileName, GENERIC_READ | GENERIC_WRITE,
            FILE_SHARE_WRITE | FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0);
        if (INVALID_HANDLE_VALUE == hDumpFile)
        {
            FreeLibrary(hDbgHelp);
            return EXCEPTION_CONTINUE_EXECUTION;
        }
        // 写入 dmp 文件
        MINIDUMP_EXCEPTION_INFORMATION expParam;
        expParam.ThreadId = GetCurrentThreadId();
        expParam.ExceptionPointers = pExceptionPointers;
        expParam.ClientPointers = FALSE;
        pfnMiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),
            hDumpFile, MiniDumpWithDataSegs, (pExceptionPointers ? &expParam : NULL), NULL, NULL);
        // 释放文件
        CloseHandle(hDumpFile);
        FreeLibrary(hDbgHelp);
        return EXCEPTION_EXECUTE_HANDLER;
    }
    
    LONG WINAPI ExceptionFilter(LPEXCEPTION_POINTERS lpExceptionInfo)
    {
        // 这里做一些异常的过滤或提示
        if (IsDebuggerPresent()) {
            return EXCEPTION_CONTINUE_SEARCH;
        }
        return GenerateMiniDump(lpExceptionInfo);
    }
    #endif // CUSDUMP_H
    

  4. 在main.cpp中包含cusdump.h头文件,并在main()函数中第一行添加
    SetUnhandledExceptionFilter(ExceptionFilter);//调用生成dump文件的功能
     

    #include "mainwindow.h"
    
    #include <QApplication>
    
    #include "cusdump.h"
    
    int main(int argc, char *argv[])
    {
        SetUnhandledExceptionFilter(ExceptionFilter);//调用生成dump文件的功能
    
        QApplication a(argc, argv);
        MainWindow w;
        w.show();
        return a.exec();
    }
    

  5. 在mainwindow的构造函数中添加必定引发崩溃的代码作为测试
    int *p = nullptr;
    *p = 100;

  6. 用release模式进行编译,生成TestDump.exe和TestDump.pdb

  7. 新建一个releasePackage文件夹,将TestDump.exe复制进去,然后通过Qt5.9.9  (MSVC 2015 32bit)来打包软件

  8. 打包过程

  9. 打开exe文件,程序会闪退并生成dump文件,(应该是我把TCHAR 改成了CHAR,名字才会有乱码,一会删掉乱码也可以用的)

  10. 然后把这个.dmp文件和release文件夹下的.pbd文件拷贝到源码文件夹下:

  11. 用VS2015打开.dmp文件

  12. 点击“使用 仅限本机 进行调试”

  13. 之后会自动打开.对应文件,就会显示程序中断的位置了

    文件名中有乱码,点击 使用 仅限本机 进行调试 会出现找不到文件的警告,删除乱码后,就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值