Skip to content

Commit e61edca

Browse files
committed
Print script backtrace in the crash handler.
1 parent 28089c4 commit e61edca

File tree

4 files changed

+52
-0
lines changed

4 files changed

+52
-0
lines changed

platform/linuxbsd/crash_handler_linuxbsd.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
#include "crash_handler_linuxbsd.h"
3232

3333
#include "core/config/project_settings.h"
34+
#include "core/object/script_language.h"
3435
#include "core/os/os.h"
3536
#include "core/string/print_string.h"
3637
#include "core/version.h"
@@ -146,6 +147,18 @@ static void handle_crash(int sig) {
146147
print_error("-- END OF BACKTRACE --");
147148
print_error("================================================================");
148149

150+
Vector<Ref<ScriptBacktrace>> script_backtraces;
151+
if (ScriptServer::are_languages_initialized()) {
152+
script_backtraces = ScriptServer::capture_script_backtraces(false);
153+
}
154+
if (!script_backtraces.is_empty()) {
155+
for (const Ref<ScriptBacktrace> &backtrace : script_backtraces) {
156+
print_error(backtrace->format());
157+
}
158+
print_error("-- END OF SCRIPT BACKTRACE --");
159+
print_error("================================================================");
160+
}
161+
149162
// Abort to pass the error to the OS
150163
abort();
151164
}

platform/macos/crash_handler_macos.mm

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
#import "crash_handler_macos.h"
3232

3333
#include "core/config/project_settings.h"
34+
#include "core/object/script_language.h"
3435
#include "core/os/os.h"
3536
#include "core/string/print_string.h"
3637
#include "core/version.h"
@@ -177,6 +178,18 @@ static void handle_crash(int sig) {
177178
print_error("-- END OF BACKTRACE --");
178179
print_error("================================================================");
179180

181+
Vector<Ref<ScriptBacktrace>> script_backtraces;
182+
if (ScriptServer::are_languages_initialized()) {
183+
script_backtraces = ScriptServer::capture_script_backtraces(false);
184+
}
185+
if (!script_backtraces.is_empty()) {
186+
for (const Ref<ScriptBacktrace> &backtrace : script_backtraces) {
187+
print_error(backtrace->format());
188+
}
189+
print_error("-- END OF SCRIPT BACKTRACE --");
190+
print_error("================================================================");
191+
}
192+
180193
// Abort to pass the error to the OS
181194
abort();
182195
}

platform/windows/crash_handler_windows_seh.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
#include "crash_handler_windows.h"
3232

3333
#include "core/config/project_settings.h"
34+
#include "core/object/script_language.h"
3435
#include "core/os/os.h"
3536
#include "core/string/print_string.h"
3637
#include "core/version.h"
@@ -230,6 +231,18 @@ DWORD CrashHandlerException(EXCEPTION_POINTERS *ep) {
230231

231232
SymCleanup(process);
232233

234+
Vector<Ref<ScriptBacktrace>> script_backtraces;
235+
if (ScriptServer::are_languages_initialized()) {
236+
script_backtraces = ScriptServer::capture_script_backtraces(false);
237+
}
238+
if (!script_backtraces.is_empty()) {
239+
for (const Ref<ScriptBacktrace> &backtrace : script_backtraces) {
240+
print_error(backtrace->format());
241+
}
242+
print_error("-- END OF SCRIPT BACKTRACE --");
243+
print_error("================================================================");
244+
}
245+
233246
// Pass the exception to the OS
234247
return EXCEPTION_CONTINUE_SEARCH;
235248
}

platform/windows/crash_handler_windows_signal.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
#include "crash_handler_windows.h"
3232

3333
#include "core/config/project_settings.h"
34+
#include "core/object/script_language.h"
3435
#include "core/os/os.h"
3536
#include "core/string/print_string.h"
3637
#include "core/version.h"
@@ -183,6 +184,18 @@ extern void CrashHandlerException(int signal) {
183184

184185
print_error("-- END OF BACKTRACE --");
185186
print_error("================================================================");
187+
188+
Vector<Ref<ScriptBacktrace>> script_backtraces;
189+
if (ScriptServer::are_languages_initialized()) {
190+
script_backtraces = ScriptServer::capture_script_backtraces(false);
191+
}
192+
if (!script_backtraces.is_empty()) {
193+
for (const Ref<ScriptBacktrace> &backtrace : script_backtraces) {
194+
print_error(backtrace->format());
195+
}
196+
print_error("-- END OF SCRIPT BACKTRACE --");
197+
print_error("================================================================");
198+
}
186199
}
187200
#endif
188201

0 commit comments

Comments
 (0)