mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-08-08 08:07:10 +02:00
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:
parent
123fc9786a
commit
a8459b28c3
@ -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();
|
||||||
|
|
||||||
|
19
src/debug.c
19
src/debug.c
@ -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.
|
||||||
|
Loading…
Reference in New Issue
Block a user