]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: debug: create ha_backtrace_to_stderr() to dump an instant backtrace
authorWilly Tarreau <w@1wt.eu>
Fri, 22 Jan 2021 13:12:27 +0000 (14:12 +0100)
committerWilly Tarreau <w@1wt.eu>
Fri, 22 Jan 2021 13:15:36 +0000 (14:15 +0100)
This function calls the ha_dump_backtrace() function with a locally
allocated buffer and sends the output slightly indented to fd #2. It's
meant to be used as an emergency backtrace dump.

include/haproxy/debug.h
src/debug.c

index 12456b5f59251b6dbdc9773f498757579eae5a47..5cec24326cf0c41e88ea57180214ee7ab136db50 100644 (file)
@@ -29,6 +29,7 @@ extern unsigned int debug_commands_issued;
 void ha_task_dump(struct buffer *buf, const struct task *task, const char *pfx);
 void ha_thread_dump(struct buffer *buf, int thr, int calling_tid);
 void ha_dump_backtrace(struct buffer *buf, const char *prefix);
+void ha_backtrace_to_stderr();
 void ha_thread_dump_all_to_trash();
 void ha_panic();
 
index 465def26486832b6fb136e45e657ac4ba460841e..2a5e164c6dd6a8270ef587696d1b0e69fd484539 100644 (file)
@@ -91,9 +91,10 @@ void ha_dump_backtrace(struct buffer *buf, const char *prefix)
                addr = resolve_sym_name(buf, ": ", callers[j]);
                if (dump == 0) {
                        /* dump not started, will start *after*
-                        * ha_thread_dump_all_to_trash and ha_panic
+                        * ha_thread_dump_all_to_trash, ha_panic and ha_backtrace_to_stderr
                         */
-                       if (addr == ha_thread_dump_all_to_trash || addr == ha_panic)
+                       if (addr == ha_thread_dump_all_to_trash || addr == ha_panic ||
+                           addr == ha_backtrace_to_stderr)
                                dump = 1;
                        *buf = bak;
                        continue;
@@ -101,7 +102,8 @@ void ha_dump_backtrace(struct buffer *buf, const char *prefix)
 
                if (dump == 1) {
                        /* starting */
-                       if (addr == ha_thread_dump_all_to_trash || addr == ha_panic) {
+                       if (addr == ha_thread_dump_all_to_trash || addr == ha_panic ||
+                           addr == ha_backtrace_to_stderr) {
                                *buf = bak;
                                continue;
                        }
@@ -121,6 +123,17 @@ void ha_dump_backtrace(struct buffer *buf, const char *prefix)
        }
 }
 
+/* dump a backtrace of current thread's stack to stderr. */
+void ha_backtrace_to_stderr()
+{
+       char area[2048];
+       struct buffer b = b_make(area, sizeof(area), 0, 0);
+
+       ha_dump_backtrace(&b, "  ");
+       if (b.data)
+               write(2, b.area, b.data);
+}
+
 /* Dumps to the buffer some known information for the desired thread, and
  * optionally extra info for the current thread. The dump will be appended to
  * the buffer, so the caller is responsible for preliminary initializing it.