From ac29bb14011d77fc6042a8455179231450a79b9c Mon Sep 17 00:00:00 2001 From: Samuel Thibault Date: Wed, 29 Dec 2021 14:46:37 +0100 Subject: libshouldbeinlibc: Add backtrace_stderr and backtrace_mach as convenience for printing a backtrace without erroring out. --- libshouldbeinlibc/assert-backtrace.c | 37 ++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) (limited to 'libshouldbeinlibc/assert-backtrace.c') diff --git a/libshouldbeinlibc/assert-backtrace.c b/libshouldbeinlibc/assert-backtrace.c index 66ce47c1..7c6fac51 100644 --- a/libshouldbeinlibc/assert-backtrace.c +++ b/libshouldbeinlibc/assert-backtrace.c @@ -26,9 +26,13 @@ #include #include #include +#include #include "assert-backtrace.h" +static const size_t size = 128; +static const size_t skip = 2; + static void __attribute__ ((noreturn)) __assert_fail_base_backtrace (const char *fmt, const char *assertion, @@ -36,8 +40,6 @@ __assert_fail_base_backtrace (const char *fmt, unsigned int line, const char *function) { - const size_t size = 128; - const size_t skip = 2; int nptrs; void *buffer[size]; @@ -79,4 +81,35 @@ __assert_perror_fail_backtrace (int errnum, } +void +backtrace_stderr (void) +{ + int nptrs; + void *buffer[size]; + + nptrs = backtrace (buffer, size); + backtrace_symbols_fd (buffer, nptrs, STDERR_FILENO); + fflush (stderr); +} + +void +backtrace_mach (void) +{ + int nptrs; + void *buffer[size]; + char **symbols; + int i; + + nptrs = backtrace (buffer, size); + symbols = backtrace_symbols (buffer, nptrs); + + for (i = 0; i < nptrs; i++) + { + mach_print(symbols[i]); + mach_print("\n"); + } + + free(symbols); +} + #endif /* ! defined NDEBUG */ -- cgit v1.2.3