Skip to content

Commit 872ca1b

Browse files
committed
Merge pull request godotengine#106139 from akien-mga/crash-handler-backtrace-print
Improve script backtrace print in crash handlers
2 parents 6d3f918 + a6398d7 commit 872ca1b

File tree

4 files changed

+24
-40
lines changed

4 files changed

+24
-40
lines changed

platform/linuxbsd/crash_handler_linuxbsd.cpp

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,8 @@ static void handle_crash(int sig) {
6767
String _execpath = OS::get_singleton()->get_executable_path();
6868

6969
String msg;
70-
const ProjectSettings *proj_settings = ProjectSettings::get_singleton();
71-
if (proj_settings) {
72-
msg = proj_settings->get("debug/settings/crash_handler/message");
70+
if (ProjectSettings::get_singleton()) {
71+
msg = GLOBAL_GET("debug/settings/crash_handler/message");
7372
}
7473

7574
// Tell MainLoop about the crash. This can be handled by users too in Node.
@@ -144,21 +143,18 @@ static void handle_crash(int sig) {
144143

145144
free(strings);
146145
}
147-
print_error("-- END OF BACKTRACE --");
146+
print_error("-- END OF C++ BACKTRACE --");
148147
print_error("================================================================");
149148

150-
Vector<Ref<ScriptBacktrace>> script_backtraces;
151149
if (ScriptServer::are_languages_initialized()) {
152-
script_backtraces = ScriptServer::capture_script_backtraces(false);
153-
}
154-
if (!script_backtraces.is_empty()) {
150+
Vector<Ref<ScriptBacktrace>> script_backtraces = ScriptServer::capture_script_backtraces(false);
155151
for (const Ref<ScriptBacktrace> &backtrace : script_backtraces) {
156152
if (!backtrace->is_empty()) {
157153
print_error(backtrace->format());
154+
print_error(vformat("-- END OF %s BACKTRACE --", backtrace->get_language_name().to_upper()));
155+
print_error("================================================================");
158156
}
159157
}
160-
print_error("-- END OF SCRIPT BACKTRACE --");
161-
print_error("================================================================");
162158
}
163159

164160
// Abort to pass the error to the OS

platform/macos/crash_handler_macos.mm

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,8 @@ static void handle_crash(int sig) {
9090
String _execpath = OS::get_singleton()->get_executable_path();
9191

9292
String msg;
93-
const ProjectSettings *proj_settings = ProjectSettings::get_singleton();
94-
if (proj_settings) {
95-
msg = proj_settings->get("debug/settings/crash_handler/message");
93+
if (ProjectSettings::get_singleton()) {
94+
msg = GLOBAL_GET("debug/settings/crash_handler/message");
9695
}
9796

9897
// Tell MainLoop about the crash. This can be handled by users too in Node.
@@ -174,21 +173,18 @@ static void handle_crash(int sig) {
174173

175174
free(strings);
176175
}
177-
print_error("-- END OF BACKTRACE --");
176+
print_error("-- END OF C++ BACKTRACE --");
178177
print_error("================================================================");
179178

180-
Vector<Ref<ScriptBacktrace>> script_backtraces;
181179
if (ScriptServer::are_languages_initialized()) {
182-
script_backtraces = ScriptServer::capture_script_backtraces(false);
183-
}
184-
if (!script_backtraces.is_empty()) {
180+
Vector<Ref<ScriptBacktrace>> script_backtraces = ScriptServer::capture_script_backtraces(false);
185181
for (const Ref<ScriptBacktrace> &backtrace : script_backtraces) {
186182
if (!backtrace->is_empty()) {
187183
print_error(backtrace->format());
184+
print_error(vformat("-- END OF %s BACKTRACE --", backtrace->get_language_name().to_upper()));
185+
print_error("================================================================");
188186
}
189187
}
190-
print_error("-- END OF SCRIPT BACKTRACE --");
191-
print_error("================================================================");
192188
}
193189

194190
// Abort to pass the error to the OS

platform/windows/crash_handler_windows_seh.cpp

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -134,9 +134,8 @@ DWORD CrashHandlerException(EXCEPTION_POINTERS *ep) {
134134
}
135135

136136
String msg;
137-
const ProjectSettings *proj_settings = ProjectSettings::get_singleton();
138-
if (proj_settings) {
139-
msg = proj_settings->get("debug/settings/crash_handler/message");
137+
if (ProjectSettings::get_singleton()) {
138+
msg = GLOBAL_GET("debug/settings/crash_handler/message");
140139
}
141140

142141
// Tell MainLoop about the crash. This can be handled by users too in Node.
@@ -226,23 +225,20 @@ DWORD CrashHandlerException(EXCEPTION_POINTERS *ep) {
226225
}
227226
} while (frame.AddrReturn.Offset != 0 && n < 256);
228227

229-
print_error("-- END OF BACKTRACE --");
228+
print_error("-- END OF C++ BACKTRACE --");
230229
print_error("================================================================");
231230

232231
SymCleanup(process);
233232

234-
Vector<Ref<ScriptBacktrace>> script_backtraces;
235233
if (ScriptServer::are_languages_initialized()) {
236-
script_backtraces = ScriptServer::capture_script_backtraces(false);
237-
}
238-
if (!script_backtraces.is_empty()) {
234+
Vector<Ref<ScriptBacktrace>> script_backtraces = ScriptServer::capture_script_backtraces(false);
239235
for (const Ref<ScriptBacktrace> &backtrace : script_backtraces) {
240236
if (!backtrace->is_empty()) {
241237
print_error(backtrace->format());
238+
print_error(vformat("-- END OF %s BACKTRACE --", backtrace->get_language_name().to_upper()));
239+
print_error("================================================================");
242240
}
243241
}
244-
print_error("-- END OF SCRIPT BACKTRACE --");
245-
print_error("================================================================");
246242
}
247243

248244
// Pass the exception to the OS

platform/windows/crash_handler_windows_signal.cpp

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -140,9 +140,8 @@ extern void CrashHandlerException(int signal) {
140140
}
141141

142142
String msg;
143-
const ProjectSettings *proj_settings = ProjectSettings::get_singleton();
144-
if (proj_settings) {
145-
msg = proj_settings->get("debug/settings/crash_handler/message");
143+
if (ProjectSettings::get_singleton()) {
144+
msg = GLOBAL_GET("debug/settings/crash_handler/message");
146145
}
147146

148147
// Tell MainLoop about the crash. This can be handled by users too in Node.
@@ -182,21 +181,18 @@ extern void CrashHandlerException(int signal) {
182181
backtrace_simple(data.state, 1, &trace_callback, &error_callback, reinterpret_cast<void *>(&data));
183182
}
184183

185-
print_error("-- END OF BACKTRACE --");
184+
print_error("-- END OF C++ BACKTRACE --");
186185
print_error("================================================================");
187186

188-
Vector<Ref<ScriptBacktrace>> script_backtraces;
189187
if (ScriptServer::are_languages_initialized()) {
190-
script_backtraces = ScriptServer::capture_script_backtraces(false);
191-
}
192-
if (!script_backtraces.is_empty()) {
188+
Vector<Ref<ScriptBacktrace>> script_backtraces = ScriptServer::capture_script_backtraces(false);
193189
for (const Ref<ScriptBacktrace> &backtrace : script_backtraces) {
194190
if (!backtrace->is_empty()) {
195191
print_error(backtrace->format());
192+
print_error(vformat("-- END OF %s BACKTRACE --", backtrace->get_language_name().to_upper()));
193+
print_error("================================================================");
196194
}
197195
}
198-
print_error("-- END OF SCRIPT BACKTRACE --");
199-
print_error("================================================================");
200196
}
201197
}
202198
#endif

0 commit comments

Comments
 (0)