11#include " DFHackVersion.h"
2+
23#include < csignal>
34#include < iomanip>
45#include < filesystem>
@@ -42,7 +43,8 @@ void signal_crashlog_complete() {
4243
4344std::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+
6470void dfhack_crashlog_handle_terminate () {
65- dfhack_crashlog_handle_signal (0 );
71+ handle_signal_internal (0 );
6672}
6773
6874std::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