diff --git a/tdutils/td/utils/port/signals.cpp b/tdutils/td/utils/port/signals.cpp index 03e823934..4fcf34b82 100644 --- a/tdutils/td/utils/port/signals.cpp +++ b/tdutils/td/utils/port/signals.cpp @@ -306,6 +306,7 @@ static void block_stdin() { } static void default_failure_signal_handler(int sig) { + Stacktrace::init(); signal_safe_write_signal_number(sig); Stacktrace::PrintOptions options; diff --git a/tdutils/td/utils/port/stacktrace.cpp b/tdutils/td/utils/port/stacktrace.cpp index 18f0e372f..384b2d0f6 100644 --- a/tdutils/td/utils/port/stacktrace.cpp +++ b/tdutils/td/utils/port/stacktrace.cpp @@ -114,4 +114,11 @@ void Stacktrace::print_to_stderr(const PrintOptions &options) { print_backtrace(); } +void Stacktrace::init() { +#if __GLIBC__ + void *buffer[1]; + backtrace(buffer, 1); +#endif +} + } // namespace td diff --git a/tdutils/td/utils/port/stacktrace.h b/tdutils/td/utils/port/stacktrace.h index fbc4e78f4..5a16ec01f 100644 --- a/tdutils/td/utils/port/stacktrace.h +++ b/tdutils/td/utils/port/stacktrace.h @@ -16,6 +16,8 @@ class Stacktrace { } }; static void print_to_stderr(const PrintOptions &options = PrintOptions()); + // backtrace needs to be called once to ensure that next calls are async-signal-safe + static void init(); }; } // namespace td