Skip to content

Commit d6eaea1

Browse files
committed
Ensure the dfhack signal handler doesn't appear in crashlogs
1 parent 0f3726c commit d6eaea1

1 file changed

Lines changed: 11 additions & 4 deletions

File tree

library/Crashlog.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include "DFHackVersion.h"
2+
23
#include <csignal>
34
#include <iomanip>
45
#include <filesystem>
@@ -42,7 +43,8 @@ void signal_crashlog_complete() {
4243

4344
std::thread crashlog_thread;
4445

45-
extern "C" void dfhack_crashlog_handle_signal(int sig) {
46+
// Force this method to be inlined so that it doesn't create a stack frame
47+
[[gnu::always_inline]] inline void handle_signal_internal(int sig) {
4648
if (shutdown.load() || crashed.exchange(true) || crashlog_ready.load()) {
4749
// Ensure the signal handler doesn't try to write a crashlog
4850
// whilst the crashlog thread is unavailable.
@@ -61,8 +63,12 @@ extern "C" void dfhack_crashlog_handle_signal(int sig) {
6163
std::quick_exit(1);
6264
}
6365

66+
extern "C" void dfhack_crashlog_handle_signal(int sig) {
67+
handle_signal_internal(sig);
68+
}
69+
6470
void dfhack_crashlog_handle_terminate() {
65-
dfhack_crashlog_handle_signal(0);
71+
handle_signal_internal(0);
6672
}
6773

6874
std::string signal_name(int sig) {
@@ -122,8 +128,9 @@ void dfhack_save_crashlog() {
122128
crashlog << "Signal " << signal << "\n";
123129
}
124130

125-
for (int i = 0; i < crash_info.backtrace_entries; i++) {
126-
crashlog << i << "> " << backtrace_strings[i] << "\n";
131+
// Skip the first backtrace entry as it will always be dfhack_crashlog_handle_(signal|terminate)
132+
for (int i = 1; i < crash_info.backtrace_entries; i++) {
133+
crashlog << i - 1 << "> " << backtrace_strings[i] << "\n";
127134
}
128135
} catch (...) {}
129136

0 commit comments

Comments
 (0)