From 7fa4f2ae2eb1b7fefb9834bd05d3af506802de63 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Wed, 4 Mar 2020 11:54:16 +0100 Subject: [PATCH] MINOR: debug: use our own backtrace function on clang+x86_64 A test on FreeBSD with clang 4 to 8 produces this on a call to a spinning loop on the CLI: call trace(5): | 0x53e2bc [eb 16 48 63 c3 48 c1 e0]: wdt_handler+0x10c | 0x800e02cfe [e8 5d 83 00 00 8b 18 8b]: libthr:pthread_sigmask+0x53e with our own function it correctly produces this: call trace(20): | 0x53e2dc [eb 16 48 63 c3 48 c1 e0]: wdt_handler+0x10c | 0x800e02cfe [e8 5d 83 00 00 8b 18 8b]: libthr:pthread_sigmask+0x53e | 0x800e022bf [48 83 c4 38 5b 41 5c 41]: libthr:pthread_getspecific+0xdef | 0x7ffffffff003 [48 8d 7c 24 10 6a 00 48]: main+0x7fffffb416f3 | 0x801373809 [85 c0 0f 84 6f ff ff ff]: libc:__sys_gettimeofday+0x199 | 0x801373709 [89 c3 85 c0 75 a6 48 8b]: libc:__sys_gettimeofday+0x99 | 0x801371c62 [83 f8 4e 75 0f 48 89 df]: libc:gettimeofday+0x12 | 0x51fa0a [48 89 df 4c 89 f6 e8 6b]: ha_thread_dump_all_to_trash+0x49a | 0x4b723b [85 c0 75 09 49 8b 04 24]: mworker_cli_sockpair_new+0xd9b | 0x4b6c68 [85 c0 75 08 4c 89 ef e8]: mworker_cli_sockpair_new+0x7c8 | 0x532f81 [4c 89 e7 48 83 ef 80 41]: task_run_applet+0xe1 So let's add clang+x86_64 to the list of platforms that will use our simplified version. As a bonus it will not require to link with -lexecinfo on FreeBSD and will work out of the box when passing USE_BACKTRACE=1. (cherry picked from commit 899e5f69a1085983f52a46cd842921874fd2de36) Signed-off-by: Willy Tarreau --- include/common/compat.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/include/common/compat.h b/include/common/compat.h index 331c324..05701c1 100644 --- a/include/common/compat.h +++ b/include/common/compat.h @@ -218,6 +218,10 @@ typedef struct { } empty_t; * probably due to an alternate stack for the signal handler which does not * create a new frame hence doesn't store the caller's return address. */ +#elif defined(__clang__) && defined(__x86_64__) +/* this is on FreeBSD, clang 4.0 to 8.0 produce don't go further than the + * sighandler. + */ #else #define HA_HAVE_WORKING_BACKTRACE #endif -- 1.7.10.4