RabbitCommon v2.2.6
Loading...
Searching...
No Matches
QMiniDumper.cpp
1// Window以及Ubuntu下的core dump调试方法: https://blog.csdn.net/zhoukehu_CSDN/article/details/125152019?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-125152019-blog-109705192.235^v38^pc_relevant_sort_base3&spm=1001.2101.3001.4242.1&utm_relevant_index=3
2// Windows平台coredump处理: https://blog.csdn.net/mumufan05/article/details/109705192?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-2-109705192-blog-7306282.pc_relevant_aa&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-2-109705192-blog-7306282.pc_relevant_aa&utm_relevant_index=5
3
4#include <qglobal.h>
5
6#ifdef Q_OS_WIN
7#include <Windows.h>
8#include "dbghelp.h"
9#include <QDir>
10#include <QDateTime>
11#ifdef HAVE_RABBITCOMMON_GUI
12#include <QMessageBox>
13#endif
14#include <QTranslator>
15#include <QCoreApplication>
16#include "MiniDumper.h"
17
18//#pragma comment( lib, "Dbghelp.lib" )
19
20namespace RabbitCommon {
21
22LONG WINAPI AppExceptionCallback(struct _EXCEPTION_POINTERS *ExceptionInfo)
23{
24 if (!QDir("logs").exists())
25 {
26 QDir().mkdir("logs");
27 }
28
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())
35 );
36
37 QString msg;
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)
43 {
44 MINIDUMP_EXCEPTION_INFORMATION ExpParam;
45 ExpParam.ThreadId = GetCurrentThreadId();
46 ExpParam.ExceptionPointers = ExceptionInfo;
47 ExpParam.ClientPointers = TRUE;
48
49 // 创建Dump文件
50 MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),
51 hDumpFile, MiniDumpWithDataSegs,
52 ExceptionInfo ? &ExpParam : nullptr, nullptr, nullptr);
53 CloseHandle(hDumpFile);
54 }
55
56 // 提示
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);
63#endif
64
65 return EXCEPTION_EXECUTE_HANDLER;
66}
67
68void EnableMiniDumper()
69{
70 SetUnhandledExceptionFilter(AppExceptionCallback);
71}
72
73} // namespace RabbitCommon
74
75#endif //Q_OS_WIN