Added debug commands "ready", "running", and "waiting" that only list those

threads which are doing said thing.
Replaced all dprintf() calls from the kernel debugger with kprintf() calls.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@13883 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler 2005-08-02 16:27:00 +00:00
parent ed65cbe349
commit 8b45467cd0

View File

@ -499,39 +499,39 @@ static struct thread *last_thread_dumped = NULL;
static void static void
_dump_thread_info(struct thread *t) _dump_thread_info(struct thread *t)
{ {
dprintf("THREAD: %p\n", t); kprintf("THREAD: %p\n", t);
dprintf("id: 0x%lx\n", t->id); kprintf("id: 0x%lx\n", t->id);
dprintf("name: \"%s\"\n", t->name); kprintf("name: \"%s\"\n", t->name);
dprintf("all_next: %p\nteam_next: %p\nq_next: %p\n", kprintf("all_next: %p\nteam_next: %p\nq_next: %p\n",
t->all_next, t->team_next, t->queue_next); t->all_next, t->team_next, t->queue_next);
dprintf("priority: %ld\n", t->priority); kprintf("priority: %ld\n", t->priority);
dprintf("state: %s\n", state_to_text(t, t->state)); kprintf("state: %s\n", state_to_text(t, t->state));
dprintf("next_state: %s\n", state_to_text(t, t->next_state)); kprintf("next_state: %s\n", state_to_text(t, t->next_state));
dprintf("cpu: %p ", t->cpu); kprintf("cpu: %p ", t->cpu);
if (t->cpu) if (t->cpu)
dprintf("(%d)\n", t->cpu->info.cpu_num); kprintf("(%d)\n", t->cpu->info.cpu_num);
else else
dprintf("\n"); kprintf("\n");
dprintf("sig_pending: 0x%lx\n", t->sig_pending); kprintf("sig_pending: 0x%lx\n", t->sig_pending);
dprintf("in_kernel: %d\n", t->in_kernel); kprintf("in_kernel: %d\n", t->in_kernel);
dprintf(" sem.blocking: 0x%lx\n", t->sem.blocking); kprintf(" sem.blocking: 0x%lx\n", t->sem.blocking);
dprintf(" sem.count: 0x%lx\n", t->sem.count); kprintf(" sem.count: 0x%lx\n", t->sem.count);
dprintf(" sem.acquire_status: 0x%lx\n", t->sem.acquire_status); kprintf(" sem.acquire_status: 0x%lx\n", t->sem.acquire_status);
dprintf(" sem.flags: 0x%lx\n", t->sem.flags); kprintf(" sem.flags: 0x%lx\n", t->sem.flags);
dprintf("fault_handler: %p\n", (void *)t->fault_handler); kprintf("fault_handler: %p\n", (void *)t->fault_handler);
dprintf("args: %p %p\n", t->args1, t->args2); kprintf("args: %p %p\n", t->args1, t->args2);
dprintf("entry: %p\n", (void *)t->entry); kprintf("entry: %p\n", (void *)t->entry);
dprintf("team: %p, \"%s\"\n", t->team, t->team->name); kprintf("team: %p, \"%s\"\n", t->team, t->team->name);
dprintf("exit.sem: 0x%lx\n", t->exit.sem); kprintf("exit.sem: 0x%lx\n", t->exit.sem);
dprintf("kernel_stack_area: 0x%lx\n", t->kernel_stack_area); kprintf("kernel_stack_area: 0x%lx\n", t->kernel_stack_area);
dprintf("kernel_stack_base: %p\n", (void *)t->kernel_stack_base); kprintf("kernel_stack_base: %p\n", (void *)t->kernel_stack_base);
dprintf("user_stack_area: 0x%lx\n", t->user_stack_area); kprintf("user_stack_area: 0x%lx\n", t->user_stack_area);
dprintf("user_stack_base: %p\n", (void *)t->user_stack_base); kprintf("user_stack_base: %p\n", (void *)t->user_stack_base);
dprintf("user_local_storage: %p\n", (void *)t->user_local_storage); kprintf("user_local_storage: %p\n", (void *)t->user_local_storage);
dprintf("kernel_errno: %d\n", t->kernel_errno); kprintf("kernel_errno: %d\n", t->kernel_errno);
dprintf("kernel_time: %Ld\n", t->kernel_time); kprintf("kernel_time: %Ld\n", t->kernel_time);
dprintf("user_time: %Ld\n", t->user_time); kprintf("user_time: %Ld\n", t->user_time);
dprintf("architecture dependant section:\n"); kprintf("architecture dependant section:\n");
arch_thread_dump_info(&t->arch_info); arch_thread_dump_info(&t->arch_info);
last_thread_dumped = t; last_thread_dumped = t;
@ -547,7 +547,7 @@ dump_thread_info(int argc, char **argv)
struct hash_iterator i; struct hash_iterator i;
if (argc > 2) { if (argc > 2) {
dprintf("usage: thread [id/name]\n"); kprintf("usage: thread [id/name]\n");
return 0; return 0;
} }
@ -582,26 +582,37 @@ dump_thread_list(int argc, char **argv)
{ {
struct thread *t; struct thread *t;
struct hash_iterator i; struct hash_iterator i;
int32 requiredState = 0;
dprintf("thread id state sem cpu stack name\n"); if (!strcmp(argv[0], "ready"))
requiredState = B_THREAD_READY;
else if (!strcmp(argv[0], "running"))
requiredState = B_THREAD_RUNNING;
else if (!strcmp(argv[0], "waiting"))
requiredState = B_THREAD_WAITING;
kprintf("thread id state sem cpu stack name\n");
hash_open(sThreadHash, &i); hash_open(sThreadHash, &i);
while ((t = hash_next(sThreadHash, &i)) != NULL) { while ((t = hash_next(sThreadHash, &i)) != NULL) {
dprintf("%p %6lx %-9s", t, t->id, state_to_text(t, t->state)); if (requiredState && t->state != requiredState)
continue;
kprintf("%p %6lx %-9s", t, t->id, state_to_text(t, t->state));
// does it block on a semaphore? // does it block on a semaphore?
if (t->state == B_THREAD_WAITING) if (t->state == B_THREAD_WAITING)
dprintf("%6lx ", t->sem.blocking); kprintf("%6lx ", t->sem.blocking);
else else
dprintf(" - "); kprintf(" - ");
// on which CPU does it run? // on which CPU does it run?
if (t->cpu) if (t->cpu)
dprintf("%2d", t->cpu->info.cpu_num); kprintf("%2d", t->cpu->info.cpu_num);
else else
dprintf(" -"); kprintf(" -");
dprintf(" %p %s\n", (void *)t->kernel_stack_base, t->name != NULL ? t->name : "<NULL>"); kprintf(" %p %s\n", (void *)t->kernel_stack_base, t->name != NULL ? t->name : "<NULL>");
} }
hash_close(sThreadHash, &i, false); hash_close(sThreadHash, &i, false);
return 0; return 0;
@ -614,15 +625,15 @@ dump_next_thread_in_q(int argc, char **argv)
struct thread *t = last_thread_dumped; struct thread *t = last_thread_dumped;
if (t == NULL) { if (t == NULL) {
dprintf("no thread previously dumped. Examine a thread first.\n"); kprintf("no thread previously dumped. Examine a thread first.\n");
return 0; return 0;
} }
dprintf("next thread in queue after thread @ %p\n", t); kprintf("next thread in queue after thread @ %p\n", t);
if (t->queue_next != NULL) if (t->queue_next != NULL)
_dump_thread_info(t->queue_next); _dump_thread_info(t->queue_next);
else else
dprintf("NULL\n"); kprintf("NULL\n");
return 0; return 0;
} }
@ -634,15 +645,15 @@ dump_next_thread_in_all_list(int argc, char **argv)
struct thread *t = last_thread_dumped; struct thread *t = last_thread_dumped;
if (t == NULL) { if (t == NULL) {
dprintf("no thread previously dumped. Examine a thread first.\n"); kprintf("no thread previously dumped. Examine a thread first.\n");
return 0; return 0;
} }
dprintf("next thread in global list after thread @ %p\n", t); kprintf("next thread in global list after thread @ %p\n", t);
if (t->all_next != NULL) if (t->all_next != NULL)
_dump_thread_info(t->all_next); _dump_thread_info(t->all_next);
else else
dprintf("NULL\n"); kprintf("NULL\n");
return 0; return 0;
} }
@ -654,15 +665,15 @@ dump_next_thread_in_team(int argc, char **argv)
struct thread *t = last_thread_dumped; struct thread *t = last_thread_dumped;
if (t == NULL) { if (t == NULL) {
dprintf("no thread previously dumped. Examine a thread first.\n"); kprintf("no thread previously dumped. Examine a thread first.\n");
return 0; return 0;
} }
dprintf("next thread in team after thread @ %p\n", t); kprintf("next thread in team after thread @ %p\n", t);
if (t->team_next != NULL) if (t->team_next != NULL)
_dump_thread_info(t->team_next); _dump_thread_info(t->team_next);
else else
dprintf("NULL\n"); kprintf("NULL\n");
return 0; return 0;
} }
@ -1323,6 +1334,9 @@ thread_init(kernel_args *args)
// set up some debugger commands // set up some debugger commands
add_debugger_command("threads", &dump_thread_list, "list all threads"); add_debugger_command("threads", &dump_thread_list, "list all threads");
add_debugger_command("ready", &dump_thread_list, "list all ready threads");
add_debugger_command("running", &dump_thread_list, "list all running threads");
add_debugger_command("waiting", &dump_thread_list, "list all waiting threads");
add_debugger_command("thread", &dump_thread_info, "list info about a particular thread"); add_debugger_command("thread", &dump_thread_info, "list info about a particular thread");
add_debugger_command("next_q", &dump_next_thread_in_q, "dump the next thread in the queue of last thread viewed"); add_debugger_command("next_q", &dump_next_thread_in_q, "dump the next thread in the queue of last thread viewed");
add_debugger_command("next_all", &dump_next_thread_in_all_list, "dump the next thread in the global list of the last thread viewed"); add_debugger_command("next_all", &dump_next_thread_in_all_list, "dump the next thread in the global list of the last thread viewed");