您当前的位置: 首页 >  qt

龚建波

暂无认证

  • 3浏览

    0关注

    312博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

记录:MSVC+Qt生成dump文件

龚建波 发布时间:2021-02-11 19:14:14 ,浏览量:3

本文只是记录下 MSVC+Qt 生成 dump 的代码。

dump 文件能够保存程序内部的内存、堆栈、句柄、线程等程序运行相关的信息,当程序异常无法在调试环境里解决时,dump 文件是分析问题的重要手段。

相关 win API 文档可以在 MSDN 查看:https://docs.microsoft.com/zh-cn/search/?terms=MiniDumpWriteDump

DUMPTYPE 参数我只使用了 MiniDumpNormal,可以根据文档加上自己需要的。

dump 文件一般配合 pdb 文件使用,通过 pdb 可以找到堆栈地址对应的函数、行号等。

如果使用的 QtCreator,可以打开如下设置:

如果使用 VS ,可以打开如下两个设置:

生成 dump 完整代码: 

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

#include 

int main(int argc, char *argv[])
{
    CrashDump::init("Test");

    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}
#pragma once

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#pragma comment(lib, "DbgHelp")
#include 

static QString __module_name;

/**
 * @brief MSVC+Qt 生成dump文件
 * @author 龚建波
 * @date 2021-2-11
 * @details 配合pdb文件使用,生成exe时记得生成dpb
 */
class CrashDump
{
public:
    //初始化注册
    static void init(const QString &module)
    {
        __module_name=module;
        //异常捕获
        ::SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)exceptionFilter);
    }

    //获取exe路径
    static QString getAppPath()
    {
        DWORD v;
        QVarLengthArray buffer;
        size_t size = 0;
        do {
            size += 2048;
            buffer.resize((int)size);
            v = ::GetModuleFileNameA(NULL, buffer.data(), DWORD(buffer.size()));
        } while (v >= size);

        return QString::fromLocal8Bit(buffer.data(), v);
    }

    //生成dump路径,可以自定义路径以及命名格式
    static QString getDumpPath()
    {
        QFileInfo app_info(getAppPath());
        QString dump_path=QString("%1/dump/%2 %3.dmp")
                .arg(app_info.absolutePath())
                .arg(__module_name)
                .arg(QDateTime::currentDateTime().toString("yyyy_MM_dd hh.mm.ss"));
        QFileInfo dump_info(dump_path);
        if(!dump_info.dir().exists()&&!dump_info.dir().mkpath(dump_info.absolutePath()))
            dump_path=QString("%1.dump").arg(__module_name);
        return dump_path;
    }

    //异常处理
    static LONG exceptionFilter(LPEXCEPTION_POINTERS lpExceptionInfo)
    {
        QString dump_path = getDumpPath();
        std::cerr            
关注
打赏
1655829268
查看更多评论
0.0718s