Improve crash handler message display

- State the Godot version and full hash in the backtrace.
- Add decoration around the crash backtrace, both to make it stand out
  from other messages and help the user figure out what they should copy.

(cherry picked from commit 8556dd1bef)
This commit is contained in:
Hugo Locurcio 2021-04-12 16:59:23 +02:00 committed by Rémi Verschelde
parent e2b71de38b
commit 4d94aba0ed
No known key found for this signature in database
GPG key ID: C3336907360768E1
3 changed files with 30 additions and 0 deletions

View file

@ -32,6 +32,8 @@
#include "core/os/os.h"
#include "core/project_settings.h"
#include "core/version.h"
#include "core/version_hash.gen.h"
#include "main/main.h"
#include <string.h>
@ -85,11 +87,18 @@ static void handle_crash(int sig) {
}
// Dump the backtrace to stderr with a message to the user
fprintf(stderr, "\n================================================================\n");
fprintf(stderr, "%s: Program crashed with signal %d\n", __FUNCTION__, sig);
if (OS::get_singleton()->get_main_loop())
OS::get_singleton()->get_main_loop()->notification(MainLoop::NOTIFICATION_CRASH);
// Print the engine version just before, so that people are reminded to include the version in backtrace reports.
if (String(VERSION_HASH).length() != 0) {
fprintf(stderr, "Engine version: " VERSION_FULL_NAME " (" VERSION_HASH ")\n");
} else {
fprintf(stderr, "Engine version: " VERSION_FULL_NAME "\n");
}
fprintf(stderr, "Dumping the backtrace. %ls\n", msg.c_str());
char **strings = backtrace_symbols(bt_buffer, size);
if (strings) {
@ -148,6 +157,7 @@ static void handle_crash(int sig) {
free(strings);
}
fprintf(stderr, "-- END OF BACKTRACE --\n");
fprintf(stderr, "================================================================\n");
// Abort to pass the error to the OS
abort();

View file

@ -32,6 +32,8 @@
#include "core/os/os.h"
#include "core/project_settings.h"
#include "core/version.h"
#include "core/version_hash.gen.h"
#include "main/main.h"
#ifdef CRASH_HANDLER_EXCEPTION
@ -127,6 +129,7 @@ DWORD CrashHandlerException(EXCEPTION_POINTERS *ep) {
return EXCEPTION_CONTINUE_SEARCH;
}
fprintf(stderr, "\n================================================================\n");
fprintf(stderr, "%s: Program crashed\n", __FUNCTION__);
if (OS::get_singleton()->get_main_loop())
@ -175,6 +178,12 @@ DWORD CrashHandlerException(EXCEPTION_POINTERS *ep) {
msg = proj_settings->get("debug/settings/crash_handler/message");
}
// Print the engine version just before, so that people are reminded to include the version in backtrace reports.
if (String(VERSION_HASH).length() != 0) {
fprintf(stderr, "Engine version: " VERSION_FULL_NAME " (" VERSION_HASH ")\n");
} else {
fprintf(stderr, "Engine version: " VERSION_FULL_NAME "\n");
}
fprintf(stderr, "Dumping the backtrace. %ls\n", msg.c_str());
int n = 0;
@ -200,6 +209,7 @@ DWORD CrashHandlerException(EXCEPTION_POINTERS *ep) {
} while (frame.AddrReturn.Offset != 0 && n < 256);
fprintf(stderr, "-- END OF BACKTRACE --\n");
fprintf(stderr, "================================================================\n");
SymCleanup(process);

View file

@ -32,6 +32,8 @@
#include "core/os/os.h"
#include "core/project_settings.h"
#include "core/version.h"
#include "core/version_hash.gen.h"
#include "main/main.h"
#ifdef DEBUG_ENABLED
@ -61,12 +63,19 @@ static void handle_crash(int sig) {
}
// Dump the backtrace to stderr with a message to the user
fprintf(stderr, "\n================================================================\n");
fprintf(stderr, "%s: Program crashed with signal %d\n", __FUNCTION__, sig);
if (OS::get_singleton()->get_main_loop()) {
OS::get_singleton()->get_main_loop()->notification(MainLoop::NOTIFICATION_CRASH);
}
// Print the engine version just before, so that people are reminded to include the version in backtrace reports.
if (String(VERSION_HASH).length() != 0) {
fprintf(stderr, "Engine version: " VERSION_FULL_NAME " (" VERSION_HASH ")\n");
} else {
fprintf(stderr, "Engine version: " VERSION_FULL_NAME "\n");
}
fprintf(stderr, "Dumping the backtrace. %ls\n", msg.c_str());
char **strings = backtrace_symbols(bt_buffer, size);
if (strings) {
@ -115,6 +124,7 @@ static void handle_crash(int sig) {
free(strings);
}
fprintf(stderr, "-- END OF BACKTRACE --\n");
fprintf(stderr, "================================================================\n");
// Abort to pass the error to the OS
abort();