[console] add a panic time alternate version of the thread list

This works if the thread lock is held at panic time to keep it from
recursing.
This commit is contained in:
Travis Geiselbrecht
2021-10-06 23:51:59 -07:00
parent 9d2d6feffb
commit d836b07279
3 changed files with 23 additions and 7 deletions

View File

@@ -28,13 +28,15 @@
#include <stdio.h> #include <stdio.h>
static int cmd_threads(int argc, const console_cmd_args *argv); static int cmd_threads(int argc, const console_cmd_args *argv);
static int cmd_threads_panic(int argc, const console_cmd_args *argv);
static int cmd_threadstats(int argc, const console_cmd_args *argv); static int cmd_threadstats(int argc, const console_cmd_args *argv);
static int cmd_threadload(int argc, const console_cmd_args *argv); static int cmd_threadload(int argc, const console_cmd_args *argv);
static int cmd_kevlog(int argc, const console_cmd_args *argv); static int cmd_kevlog(int argc, const console_cmd_args *argv);
STATIC_COMMAND_START STATIC_COMMAND_START
#if LK_DEBUGLEVEL > 1 #if LK_DEBUGLEVEL > 1
STATIC_COMMAND_MASKED("threads", "list kernel threads", &cmd_threads, CMD_AVAIL_ALWAYS) STATIC_COMMAND("threads", "list kernel threads", &cmd_threads)
STATIC_COMMAND_MASKED("threads", "list kernel threads", &cmd_threads_panic, CMD_AVAIL_PANIC)
#endif #endif
#if THREAD_STATS #if THREAD_STATS
STATIC_COMMAND("threadstats", "thread level statistics", &cmd_threadstats) STATIC_COMMAND("threadstats", "thread level statistics", &cmd_threadstats)
@@ -52,6 +54,16 @@ static int cmd_threads(int argc, const console_cmd_args *argv) {
return 0; return 0;
} }
static int cmd_threads_panic(int argc, const console_cmd_args *argv) {
/* call the unsafe version of the thread dump routine since the
* thread lock may be held at crash time.
*/
printf("thread list:\n");
dump_all_threads_unlocked();
return 0;
}
#endif #endif
#if THREAD_STATS #if THREAD_STATS

View File

@@ -162,6 +162,7 @@ status_t thread_set_real_time(thread_t *t);
void dump_thread(thread_t *t); void dump_thread(thread_t *t);
void arch_dump_thread(thread_t *t); void arch_dump_thread(thread_t *t);
void dump_all_threads(void); void dump_all_threads(void);
void dump_all_threads_unlocked(void);
/* scheduler routines */ /* scheduler routines */
void thread_yield(void); /* give up the cpu voluntarily */ void thread_yield(void); /* give up the cpu voluntarily */

View File

@@ -988,13 +988,8 @@ void dump_thread(thread_t *t) {
arch_dump_thread(t); arch_dump_thread(t);
} }
/** void dump_all_threads_unlocked(void) {
* @brief Dump debugging info about all threads
*/
void dump_all_threads(void) {
thread_t *t; thread_t *t;
THREAD_LOCK(state);
list_for_every_entry(&thread_list, t, thread_t, thread_list_node) { list_for_every_entry(&thread_list, t, thread_t, thread_list_node) {
if (t->magic != THREAD_MAGIC) { if (t->magic != THREAD_MAGIC) {
dprintf(INFO, "bad magic on thread struct %p, aborting.\n", t); dprintf(INFO, "bad magic on thread struct %p, aborting.\n", t);
@@ -1003,6 +998,14 @@ void dump_all_threads(void) {
} }
dump_thread(t); dump_thread(t);
} }
}
/**
* @brief Dump debugging info about all threads
*/
void dump_all_threads(void) {
THREAD_LOCK(state);
dump_all_threads_unlocked();
THREAD_UNLOCK(state); THREAD_UNLOCK(state);
} }