diff options
author | Rob Norris <[email protected]> | 2024-04-27 21:35:05 +1000 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2024-05-01 10:52:00 -0700 |
commit | 2152c405ba6ab0bc9fca482e9a0a968eb35699fb (patch) | |
tree | 31a0f5f6d5d97cbfecb97a7f6520ad7f8053e6fb /lib | |
parent | dec697ad683ecfdf9833455af0568ce4ddc7c885 (diff) |
libspl/assert: dump backtrace in assert
Adds a check for the backtrace() function. If available, uses it to show
a stack backtrace in the assertion output.
Reviewed-by: Brian Behlendorf <[email protected]>
Signed-off-by: Rob Norris <[email protected]>
Sponsored-by: https://despairlabs.com/sponsor/
Closes #16140
Diffstat (limited to 'lib')
-rw-r--r-- | lib/libspl/Makefile.am | 2 | ||||
-rw-r--r-- | lib/libspl/assert.c | 20 |
2 files changed, 22 insertions, 0 deletions
diff --git a/lib/libspl/Makefile.am b/lib/libspl/Makefile.am index 822bef7e7..9f413b08c 100644 --- a/lib/libspl/Makefile.am +++ b/lib/libspl/Makefile.am @@ -43,3 +43,5 @@ libspl_la_LIBADD = \ libspl_assert.la libspl_la_LIBADD += $(LIBATOMIC_LIBS) $(LIBCLOCK_GETTIME) + +libspl_assert_la_LIBADD = $(BACKTRACE_LIBS) diff --git a/lib/libspl/assert.c b/lib/libspl/assert.c index d40246253..4acf687f4 100644 --- a/lib/libspl/assert.c +++ b/lib/libspl/assert.c @@ -49,6 +49,24 @@ pthread_getname_np(pthread_self(), buf, len); #endif +#if defined(HAVE_BACKTRACE) +#include <execinfo.h> + +static inline void +libspl_dump_backtrace(void) +{ + void *btptrs[100]; + size_t nptrs = backtrace(btptrs, 100); + char **bt = backtrace_symbols(btptrs, nptrs); + fprintf(stderr, "Call trace:\n"); + for (size_t i = 0; i < nptrs; i++) + fprintf(stderr, " %s\n", bt[i]); + free(bt); +} +#else +#define libspl_dump_backtrace() +#endif + static boolean_t libspl_assert_ok = B_FALSE; void @@ -83,6 +101,8 @@ libspl_assertf(const char *file, const char *func, int line, getpid(), libspl_getprogname(), libspl_gettid(), tname); + libspl_dump_backtrace(); + #if !__has_feature(attribute_analyzer_noreturn) && !defined(__COVERITY__) if (libspl_assert_ok) { pthread_mutex_unlock(&assert_lock); |