]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: debug: do not limit backtraces to stuck threads
authorWilly Tarreau <w@1wt.eu>
Thu, 24 Oct 2024 13:14:55 +0000 (15:14 +0200)
committerWilly Tarreau <w@1wt.eu>
Thu, 24 Oct 2024 14:12:46 +0000 (16:12 +0200)
Historically for size limitation reasons, we would only dump the
backtrace of stuck threads. The problem is that when triggering
a panic or other reasons, we have no backtrace, which effectively
limits it to the watchdog timer. It's also visible in "show threads"
which used to report backtraces for all threads in 2.4 and displays
none nowadays, making its use much more limited.

A first approach could be to just dump the thread that triggers the
panic (in addition to stuck threads). But that remains quite limited
since "show threads" would still display nothing. This patch takes a
better approach consisting in dumping all non-idle threads. This way
the output is less polluted that with the older approach (no need to
dump all those waiting in the poller), and all active threads are
visible, in panics as well as in "show threads". As such, the CLI
command "debug dev panic" now dmups backtraces again. This is already
a benefit which will ease testing of various locations against the
ability to resolve useful symbols.

src/debug.c

index e7898bb02e37b2465a91650267ae05be94988ace..c0585914944a25dbecca91ef7bc79d3d24dfaf11 100644 (file)
@@ -322,7 +322,8 @@ void ha_thread_dump_one(int thr, int from_signal)
        chunk_appendf(buf, "             curr_task=");
        ha_task_dump(buf, th_ctx->current, "             ");
 
-       if (stuck && thr == tid) {
+       if (thr == tid && !(HA_ATOMIC_LOAD(&tg_ctx->threads_idle) & ti->ltid_bit)) {
+               /* only dump the stack of active threads */
 #ifdef USE_LUA
                if (th_ctx->current &&
                    th_ctx->current->process == process_stream && th_ctx->current->context) {
@@ -346,12 +347,6 @@ void ha_thread_dump_one(int thr, int from_signal)
                if (HA_ATOMIC_LOAD(&pool_trim_in_progress))
                        mark_tainted(TAINTED_MEM_TRIMMING_STUCK);
 
-               /* We only emit the backtrace for stuck threads in order not to
-                * waste precious output buffer space with non-interesting data.
-                * Please leave this as the last instruction in this function
-                * so that the compiler uses tail merging and the current
-                * function does not appear in the stack.
-                */
                ha_dump_backtrace(buf, "             ", 0);
        }
  leave: