Qt Release模式下生成dump文件

dump.h

#ifndef MDUMP1_H
#define MDUMP1_H

#pragma once

#include <iostream>
#include <string>

#include <QApplication>
#include <QString>
#include <QDir>
#include <QDateTime>

#if defined(Q_OS_WIN32)   // Q_OS_WIN32
#include <windows.h>
#endif

namespace ysm{

    class Debug {

    public:
#if defined(Q_OS_WIN32) // 		#if defined(_MSC_VER) && _MSC_VER >= 1400
    // 奔溃回调
    static LONG WINAPI  crashStackCallback(struct _EXCEPTION_POINTERS* exceptionInfo);
#endif

    };
}




#endif // MDUMP_H

dump.cpp

#include "mdump.h"

#include <QApplication>
#include <QString>
#include <QDir>
#include <QDateTime>

#if defined(Q_OS_WIN32)   // Q_OS_WIN32
#include <Dbghelp.h>
//#pragma comment(lib, "Dbghelp.lib")
#endif

#include <QDebug>
namespace ysm {



#if defined(Q_OS_WIN32)

    LONG WINAPI Debug::crashStackCallback(struct _EXCEPTION_POINTERS* exceptionInfo) {
        QString savePath = "C:/SightPro/dump/";
        QDir dir(savePath);

        qDebug() <<"Path=" << savePath;
        if(!dir.exists() && !dir.mkpath(savePath)) {
            //app->exit(E_UNEXPECTED);
            return EXCEPTION_EXECUTE_HANDLER;
        }

        savePath.append("sightPro");
        savePath.append(".dmp");

        HANDLE dump = CreateFileW(savePath.toStdWString().c_str(), GENERIC_WRITE,
                                  0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
        if(INVALID_HANDLE_VALUE == dump) {
            //app->exit(E_UNEXPECTED);
            return EXCEPTION_EXECUTE_HANDLER;
        }

        MINIDUMP_EXCEPTION_INFORMATION miniDumpExceptionInfo;
        miniDumpExceptionInfo.ExceptionPointers = exceptionInfo;
        miniDumpExceptionInfo.ThreadId = GetCurrentThreadId();
        miniDumpExceptionInfo.ClientPointers = TRUE;
        DWORD idProcess = GetCurrentProcessId();
        MiniDumpWriteDump(GetCurrentProcess(), idProcess, dump,
                          MiniDumpWithFullMemory, &miniDumpExceptionInfo, NULL, NULL);

        // 第四个参数 DumpType 指定类型,用于生成包含不同信息、大小的dump日志。
        CloseHandle(dump);

        //app->exit(E_UNEXPECTED);
        return EXCEPTION_EXECUTE_HANDLER;
    }

#endif
}

在应用程序中调用如下:

#if defined(Q_OS_WIN32)
    SetUnhandledExceptionFilter(ysm::Debug::crashStackCallback);
#endif

同时,pro文件中添加如下内容:

QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO
LIBS += -lDbgHelp

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我想早点退休

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值