mirror of
https://github.com/JulianGro/overte.git
synced 2025-04-29 20:42:56 +02:00
Merge pull request #12971 from Atlante45/fix/crashes-hotfix
Add memory corruption crash handler
This commit is contained in:
commit
497c3fac4d
2 changed files with 29 additions and 7 deletions
|
@ -31,10 +31,27 @@ using namespace crashpad;
|
||||||
static const std::string BACKTRACE_URL { CMAKE_BACKTRACE_URL };
|
static const std::string BACKTRACE_URL { CMAKE_BACKTRACE_URL };
|
||||||
static const std::string BACKTRACE_TOKEN { CMAKE_BACKTRACE_TOKEN };
|
static const std::string BACKTRACE_TOKEN { CMAKE_BACKTRACE_TOKEN };
|
||||||
|
|
||||||
|
static std::wstring gIPCPipe;
|
||||||
|
|
||||||
extern QString qAppFileName();
|
extern QString qAppFileName();
|
||||||
|
|
||||||
// crashpad::AnnotationList* crashpadAnnotations { nullptr };
|
// crashpad::AnnotationList* crashpadAnnotations { nullptr };
|
||||||
|
|
||||||
|
#include <Windows.h>
|
||||||
|
|
||||||
|
LONG WINAPI vectoredExceptionHandler(PEXCEPTION_POINTERS pExceptionInfo) {
|
||||||
|
if (pExceptionInfo->ExceptionRecord->ExceptionCode == STATUS_HEAP_CORRUPTION ||
|
||||||
|
pExceptionInfo->ExceptionRecord->ExceptionCode == STATUS_STACK_BUFFER_OVERRUN) {
|
||||||
|
CrashpadClient client;
|
||||||
|
if (gIPCPipe.length()) {
|
||||||
|
client.SetHandlerIPCPipe(gIPCPipe);
|
||||||
|
}
|
||||||
|
client.DumpAndCrash(pExceptionInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
return EXCEPTION_CONTINUE_SEARCH;
|
||||||
|
}
|
||||||
|
|
||||||
bool startCrashHandler() {
|
bool startCrashHandler() {
|
||||||
if (BACKTRACE_URL.empty() || BACKTRACE_TOKEN.empty()) {
|
if (BACKTRACE_URL.empty() || BACKTRACE_TOKEN.empty()) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -76,7 +93,12 @@ bool startCrashHandler() {
|
||||||
// Enable automated uploads.
|
// Enable automated uploads.
|
||||||
database->GetSettings()->SetUploadsEnabled(true);
|
database->GetSettings()->SetUploadsEnabled(true);
|
||||||
|
|
||||||
return client.StartHandler(handler, db, db, BACKTRACE_URL, annotations, arguments, true, true);
|
bool result = client.StartHandler(handler, db, db, BACKTRACE_URL, annotations, arguments, true, true);
|
||||||
|
gIPCPipe = client.GetHandlerIPCPipe();
|
||||||
|
|
||||||
|
AddVectoredExceptionHandler(0, vectoredExceptionHandler);
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setCrashAnnotation(std::string name, std::string value) {
|
void setCrashAnnotation(std::string name, std::string value) {
|
||||||
|
|
|
@ -749,32 +749,32 @@ Menu::Menu() {
|
||||||
action = addActionToQMenuAndActionHash(crashMenu, MenuOption::CrashPureVirtualFunction);
|
action = addActionToQMenuAndActionHash(crashMenu, MenuOption::CrashPureVirtualFunction);
|
||||||
connect(action, &QAction::triggered, qApp, []() { crash::pureVirtualCall(); });
|
connect(action, &QAction::triggered, qApp, []() { crash::pureVirtualCall(); });
|
||||||
action = addActionToQMenuAndActionHash(crashMenu, MenuOption::CrashPureVirtualFunctionThreaded);
|
action = addActionToQMenuAndActionHash(crashMenu, MenuOption::CrashPureVirtualFunctionThreaded);
|
||||||
connect(action, &QAction::triggered, qApp, []() { std::thread([]() { crash::pureVirtualCall(); }); });
|
connect(action, &QAction::triggered, qApp, []() { std::thread(crash::pureVirtualCall).join(); });
|
||||||
|
|
||||||
action = addActionToQMenuAndActionHash(crashMenu, MenuOption::CrashDoubleFree);
|
action = addActionToQMenuAndActionHash(crashMenu, MenuOption::CrashDoubleFree);
|
||||||
connect(action, &QAction::triggered, qApp, []() { crash::doubleFree(); });
|
connect(action, &QAction::triggered, qApp, []() { crash::doubleFree(); });
|
||||||
action = addActionToQMenuAndActionHash(crashMenu, MenuOption::CrashDoubleFreeThreaded);
|
action = addActionToQMenuAndActionHash(crashMenu, MenuOption::CrashDoubleFreeThreaded);
|
||||||
connect(action, &QAction::triggered, qApp, []() { std::thread([]() { crash::doubleFree(); }); });
|
connect(action, &QAction::triggered, qApp, []() { std::thread(crash::doubleFree).join(); });
|
||||||
|
|
||||||
action = addActionToQMenuAndActionHash(crashMenu, MenuOption::CrashAbort);
|
action = addActionToQMenuAndActionHash(crashMenu, MenuOption::CrashAbort);
|
||||||
connect(action, &QAction::triggered, qApp, []() { crash::doAbort(); });
|
connect(action, &QAction::triggered, qApp, []() { crash::doAbort(); });
|
||||||
action = addActionToQMenuAndActionHash(crashMenu, MenuOption::CrashAbortThreaded);
|
action = addActionToQMenuAndActionHash(crashMenu, MenuOption::CrashAbortThreaded);
|
||||||
connect(action, &QAction::triggered, qApp, []() { std::thread([]() { crash::doAbort(); }); });
|
connect(action, &QAction::triggered, qApp, []() { std::thread(crash::doAbort).join(); });
|
||||||
|
|
||||||
action = addActionToQMenuAndActionHash(crashMenu, MenuOption::CrashNullDereference);
|
action = addActionToQMenuAndActionHash(crashMenu, MenuOption::CrashNullDereference);
|
||||||
connect(action, &QAction::triggered, qApp, []() { crash::nullDeref(); });
|
connect(action, &QAction::triggered, qApp, []() { crash::nullDeref(); });
|
||||||
action = addActionToQMenuAndActionHash(crashMenu, MenuOption::CrashNullDereferenceThreaded);
|
action = addActionToQMenuAndActionHash(crashMenu, MenuOption::CrashNullDereferenceThreaded);
|
||||||
connect(action, &QAction::triggered, qApp, []() { std::thread([]() { crash::nullDeref(); }); });
|
connect(action, &QAction::triggered, qApp, []() { std::thread(crash::nullDeref).join(); });
|
||||||
|
|
||||||
action = addActionToQMenuAndActionHash(crashMenu, MenuOption::CrashOutOfBoundsVectorAccess);
|
action = addActionToQMenuAndActionHash(crashMenu, MenuOption::CrashOutOfBoundsVectorAccess);
|
||||||
connect(action, &QAction::triggered, qApp, []() { crash::outOfBoundsVectorCrash(); });
|
connect(action, &QAction::triggered, qApp, []() { crash::outOfBoundsVectorCrash(); });
|
||||||
action = addActionToQMenuAndActionHash(crashMenu, MenuOption::CrashOutOfBoundsVectorAccessThreaded);
|
action = addActionToQMenuAndActionHash(crashMenu, MenuOption::CrashOutOfBoundsVectorAccessThreaded);
|
||||||
connect(action, &QAction::triggered, qApp, []() { std::thread([]() { crash::outOfBoundsVectorCrash(); }); });
|
connect(action, &QAction::triggered, qApp, []() { std::thread(crash::outOfBoundsVectorCrash).join(); });
|
||||||
|
|
||||||
action = addActionToQMenuAndActionHash(crashMenu, MenuOption::CrashNewFault);
|
action = addActionToQMenuAndActionHash(crashMenu, MenuOption::CrashNewFault);
|
||||||
connect(action, &QAction::triggered, qApp, []() { crash::newFault(); });
|
connect(action, &QAction::triggered, qApp, []() { crash::newFault(); });
|
||||||
action = addActionToQMenuAndActionHash(crashMenu, MenuOption::CrashNewFaultThreaded);
|
action = addActionToQMenuAndActionHash(crashMenu, MenuOption::CrashNewFaultThreaded);
|
||||||
connect(action, &QAction::triggered, qApp, []() { std::thread([]() { crash::newFault(); }); });
|
connect(action, &QAction::triggered, qApp, []() { std::thread(crash::newFault).join(); });
|
||||||
|
|
||||||
// Developer > Log...
|
// Developer > Log...
|
||||||
addActionToQMenuAndActionHash(developerMenu, MenuOption::Log, Qt::CTRL | Qt::SHIFT | Qt::Key_L,
|
addActionToQMenuAndActionHash(developerMenu, MenuOption::Log, Qt::CTRL | Qt::SHIFT | Qt::Key_L,
|
||||||
|
|
Loading…
Reference in a new issue