From: Willy Tarreau Date: Mon, 20 May 2019 11:48:29 +0000 (+0200) Subject: MINOR: debug: implement ha_panic() X-Git-Tag: v2.0-dev4~53 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=56131ca58e3427fbee48db6da381db7daf367774;p=thirdparty%2Fhaproxy.git MINOR: debug: implement ha_panic() This function dumps all existing threads using the thread dump mechanism then aborts. This will be used by the lockup detection and by debugging tools. --- diff --git a/include/common/debug.h b/include/common/debug.h index 4f3baedb79..1038041b1e 100644 --- a/include/common/debug.h +++ b/include/common/debug.h @@ -87,6 +87,7 @@ struct buffer; 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_all_to_trash(); +void ha_panic(); /* This one is useful to automatically apply poisonning on an area returned * by malloc(). Only "p_" is required to make it work, and to define a poison diff --git a/src/debug.c b/src/debug.c index fce23c389b..3e38bfa6c2 100644 --- a/src/debug.c +++ b/src/debug.c @@ -136,6 +136,17 @@ static int cli_io_handler_show_threads(struct appctx *appctx) return 1; } +/* dumps a state of all threads into the trash and on fd #2, then aborts. */ +void ha_panic() +{ + chunk_reset(&trash); + chunk_appendf(&trash, "Thread %u is about to kill the process.\n", tid); + ha_thread_dump_all_to_trash(); + write(2, trash.area, trash.data); + for (;;) + abort(); +} + #ifndef USE_THREAD_DUMP /* This function dumps all threads' state to the trash. This version is the