11#ifdef HAVE_RABBITCOMMON_GUI
15#include <QCoreApplication>
16#include "MiniDumper.h"
22LONG WINAPI AppExceptionCallback(
struct _EXCEPTION_POINTERS *ExceptionInfo)
24 if (!QDir(
"logs").exists())
29 QString dumpName = QDir::toNativeSeparators(
30 QCoreApplication::applicationDirPath() + QDir::separator()
31 + qApp->applicationName() + QString(
"_%1_%2_%3.dmp")
32 .arg(QDateTime::currentDateTime().toString(
"yyyyMMddhhmmss"))
33 .arg(GetCurrentProcessId())
34 .arg(GetCurrentThreadId())
38 HANDLE hDumpFile = CreateFileW(dumpName.toStdWString().c_str(),
39 GENERIC_READ | GENERIC_WRITE,
40 FILE_SHARE_WRITE | FILE_SHARE_READ,
41 0, CREATE_ALWAYS, 0, 0);
42 if (hDumpFile != INVALID_HANDLE_VALUE)
44 MINIDUMP_EXCEPTION_INFORMATION ExpParam;
45 ExpParam.ThreadId = GetCurrentThreadId();
46 ExpParam.ExceptionPointers = ExceptionInfo;
47 ExpParam.ClientPointers = TRUE;
50 MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),
51 hDumpFile, MiniDumpWithDataSegs,
52 ExceptionInfo ? &ExpParam : nullptr, nullptr, nullptr);
53 CloseHandle(hDumpFile);
57 QString strTitle = QObject::tr(
"Application Error");
58 QString strContent = QObject::tr(
"I'm Sorry, Application is Crash!") +
"\n\n"
59 + QObject::tr(
"The current path: ") + QDir::currentPath() +
"\n\n"
60 + QObject::tr(
"The dump file: ") + dumpName;
61#ifdef HAVE_RABBITCOMMON_GUI
62 QMessageBox::critical(0, strTitle, strContent, QMessageBox::Ok);
65 return EXCEPTION_EXECUTE_HANDLER;
68void EnableMiniDumper()
70 SetUnhandledExceptionFilter(AppExceptionCallback);