基于QT的程序崩溃抓取

使用方法:

把下面两个文件添加到项目里面

CrashCatcher.cpp



#include "CrashCatcher.h"
#include <windows.h>
#include <dbghelp.h>
#include <QDir>
#include <QDateTime>
#include <QFile>
#include <QTextStream>

static QString gDumpDir = "crash_dump";
static QString gLogFile = "crash.log";

LONG WINAPI CrashHandler(EXCEPTION_POINTERS* pException)
{
    QDir().mkpath(gDumpDir);

    QString timestamp = QDateTime::currentDateTime().toString("yyyyMMdd_HHmmss");
    QString dumpFile = QString("%1/crash_%2.dmp").arg(gDumpDir).arg(timestamp);
    HANDLE hFile = CreateFileW((LPCWSTR)dumpFile.utf16(), GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr);

    if (hFile != INVALID_HANDLE_VALUE)
    {
        MINIDUMP_EXCEPTION_INFORMATION mdei;
        mdei.ThreadId = GetCurrentThreadId();
        mdei.ExceptionPointers = pException;
        mdei.ClientPointers = FALSE;
        MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpWithDataSegs, &mdei, nullptr, nullptr);
        CloseHandle(hFile);
    }

    QFile log(gLogFile);
    if (log.open(QIODevice::Append | QIODevice::Text)) {
        QTextStream out(&log);
        out << "Crash at " << QDateTime::currentDateTime().toString() << "\n";
        out << "Exception Code: 0x" << hex << pException->ExceptionRecord->ExceptionCode << "\n";
        out << "Dump file: " << dumpFile << "\n\n";
        log.close();
    }

    return EXCEPTION_EXECUTE_HANDLER;
}

void InstallCrashHandler(const char* dumpDirectory, const char* logFile)
{
    gDumpDir = QString::fromUtf8(dumpDirectory);
    gLogFile = QString::fromUtf8(logFile);
    SetUnhandledExceptionFilter(CrashHandler);
}

CrashCatcher.h

#pragma once

#ifdef _WIN32

void InstallCrashHandler(const char* dumpDirectory = "crash_dump", const char* logFile = "crash.log");

#endif```

然后main程序入口的开始调用InstallCrashHandler(dump文件的目录,记录发生崩溃的时刻已经对应的dump文件名)

然后把程序崩溃时生成的dump文件放在你项目的exe的同级目录,用vs打开就能看到在哪个文件的哪里崩溃,崩溃的信息。

注意

必须保留崩溃时那一个版本的源码和exe,不然会乱

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

钅日 勿 XiName

给作者打赏一点小零食吧~~

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

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

打赏作者

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

抵扣说明:

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

余额充值