使用方法:
把下面两个文件添加到项目里面
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,不然会乱
5401

被折叠的 条评论
为什么被折叠?



