Browse Source

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 8556dd1bef3e74e9cb8f0c7deb68c95ece1b8e11)
Hugo Locurcio 4 years ago
parent
commit
4d94aba0ed

+ 10 - 0
platform/osx/crash_handler_osx.mm

@@ -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();

+ 10 - 0
platform/windows/crash_handler_windows.cpp

@@ -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);
 

+ 10 - 0
platform/x11/crash_handler_x11.cpp

@@ -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();