MINOR: debug: create ha_backtrace_to_stderr() to dump an instant backtrace

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.
This commit is contained in:
Willy Tarreau 2021-01-22 14:12:27 +01:00
parent 123fc9786a
commit a8459b28c3
2 changed files with 17 additions and 3 deletions

View 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_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_thread_dump(struct buffer *buf, int thr, int calling_tid);
void ha_dump_backtrace(struct buffer *buf, const char *prefix); void ha_dump_backtrace(struct buffer *buf, const char *prefix);
void ha_backtrace_to_stderr();
void ha_thread_dump_all_to_trash(); void ha_thread_dump_all_to_trash();
void ha_panic(); void ha_panic();

View File

@ -91,9 +91,10 @@ void ha_dump_backtrace(struct buffer *buf, const char *prefix)
addr = resolve_sym_name(buf, ": ", callers[j]); addr = resolve_sym_name(buf, ": ", callers[j]);
if (dump == 0) { if (dump == 0) {
/* dump not started, will start *after* /* 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; dump = 1;
*buf = bak; *buf = bak;
continue; continue;
@ -101,7 +102,8 @@ void ha_dump_backtrace(struct buffer *buf, const char *prefix)
if (dump == 1) { if (dump == 1) {
/* starting */ /* 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; *buf = bak;
continue; 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 /* 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 * optionally extra info for the current thread. The dump will be appended to
* the buffer, so the caller is responsible for preliminary initializing it. * the buffer, so the caller is responsible for preliminary initializing it.