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:
parent
ed65cbe349
commit
8b45467cd0
@ -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");
|
||||||
|
Loading…
Reference in New Issue
Block a user