diff options
author | Bernd Schubert <bschubert@ddn.com> | 2024-03-20 11:33:46 +0100 |
---|---|---|
committer | Bernd Schubert <bschubert@ddn.com> | 2024-03-20 12:37:17 +0100 |
commit | e48c71d445f8b5557f45974eb0fcf5130b1e7b20 (patch) | |
tree | 4a98512ac4f9472f78c184763c09b5c6babc5ae6 /lib | |
parent | 99ef7a93eaf5440eddc03879b483726b329ccb4b (diff) | |
download | libfuse-e48c71d445f8b5557f45974eb0fcf5130b1e7b20.tar.gz |
Add glibc backtrace to signal handler
It is very hard to see in github tests what is actually failing
with signals - add the gnu-libc backtrace handler.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/fuse_signals.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/lib/fuse_signals.c b/lib/fuse_signals.c index 048d047..4c1d172 100644 --- a/lib/fuse_signals.c +++ b/lib/fuse_signals.c @@ -16,15 +16,30 @@ #include <string.h> #include <signal.h> #include <stdlib.h> +#include <execinfo.h> static struct fuse_session *fuse_instance; +static void dump_stack(void) +{ +#ifdef HAVE_BACKTRACE + const size_t backtrace_sz = 1024 * 1024; + void* backtrace_buffer[backtrace_sz]; + + int err_fd = fileno(stderr); + + int trace_len = backtrace(backtrace_buffer, backtrace_sz); + backtrace_symbols_fd(backtrace_buffer, trace_len, err_fd); +#endif +} + static void exit_handler(int sig) { if (fuse_instance) { fuse_session_exit(fuse_instance); if(sig <= 0) { fuse_log(FUSE_LOG_ERR, "assertion error: signal value <= 0\n"); + dump_stack(); abort(); } fuse_instance->error = sig; |