The previous patch sent about two weeks ago has a problem: I define an internal marco named __show_state, but it is called with an another name "show_state". This problem efforted only the new macros "psusr" and "pskern" introduced by me. The problem has been fixed in this patch, and this patch has been tested. BTW, I haven't got reply from original authors of the doc, what should I do next? This patch is for linus-git, and it do the following: 1.updates macros in the file to fix the following errors: (gdb) btt There is no member named pid_list. (gdb) bttnobp There is no member named pid_list. 2.fix bugs in two places when iterateing thread members in a thread group original macro: 16 define bttnobp .... 21 while ($next_t != $init_t) ... 34 set $next_th=(((char *)$next_t->pids[1].pid_list.next) - $pid_off) 35 while ($next_th != $next_t) 36 set $next_th=(struct task_struct *)$next_th 37 printf "\npid %d; comm %s:\n", $next_t.pid, $next_t.comm now, we should print info about the thread member, but it print info of threadgroup leader repeatly. ... 3.introduce two auxiliary macros: psusr and pskern to list info of all tasks viewed in userspace and kernelspace respectively. The following is the testing result, bu it is test in X86 and kgdb remote debugging environment: a.out is a muti-thread program, and one of its threads exec the "top". (gdb) pskern address state uid pid ppid comm 0xC03512F4 running 0 0 0 swapper .... 0xD9418180 sleeping 0 2379 2371 bash 0xD94191C0 sleeping 0 2383 2379 a.out 0xDC52DA20 sleeping 0 2384 2379 a.out 0xDC52D610 sleeping 0 2385 2379 a.out 0xDC52D200 sleeping 0 2386 2379 a.out 0xDC52CDF0 sleeping 0 2387 2386 top address state uid pid ppid comm (gdb) btt .... pid 2379; addr:0xd9418180; comm bash: ===================================== do_wait + 2227 in section .text sys_wait4 + 121 in section .text sys_waitpid + 19 in section .text ia32_sysenter_target + 127 in section .text pid 2383; addr:0xd94191c0; comm a.out: ===================================== do_nanosleep + 84 in section .text hrtimer_nanosleep + 74 in section .text sys_nanosleep + 66 in section .text ia32_sysenter_target + 127 in section .text pid 2384; addr:0xdc52da20; comm a.out: ===================================== do_nanosleep + 84 in section .text hrtimer_nanosleep + 74 in section .text sys_nanosleep + 66 in section .text ia32_sysenter_target + 127 in section .text pid 2385; addr:0xdc52d610; comm a.out: ---Type <return> to continue, or q <return> to quit--- ===================================== do_nanosleep + 84 in section .text hrtimer_nanosleep + 74 in section .text sys_nanosleep + 66 in section .text ia32_sysenter_target + 127 in section .text pid 2386; addr:0xdc52d200; comm a.out: ===================================== do_wait + 2227 in section .text sys_wait4 + 121 in section .text sys_waitpid + 19 in section .text ia32_sysenter_target + 127 in section .text pid 2387; addr:0xdc52cdf0; comm top: ===================================== schedule_timeout + 109 in section .text do_select + 1081 in section .text core_sys_select + 440 in section .text sys_select + 143 in section .text ia32_sysenter_target + 127 in section .text Signed-off-by: Qinghuang Feng <qhfeng.kernel@xxxxxxxxx> --- diff --git a/Documentation/kdump/gdbmacros.txt b/Documentation/kdump/gdbmacros.txt index 9b9b454..84acf7d 100644 --- a/Documentation/kdump/gdbmacros.txt +++ b/Documentation/kdump/gdbmacros.txt @@ -13,39 +13,146 @@ # Maneesh Soni <maneesh@xxxxxxxxxx> # +define __show_state + if ($arg0->state == 0) + printf "running\t\t" + else + if ($arg0->state == 1) + printf "sleeping\t" + else + if ($arg0->state == 2) + printf "disksleep\t" + else + if ($arg0->state == 4) + printf "zombie\t" + else + if ($arg0->state == 8) + printf "stopped\t" + else + if ($arg0->state == 16) + printf "wpaging\t" + else + printf "%d\t\t", $arg0->state + end + end + end + end + end + end +end +document __show_state +internel macro, don't call it by hand +end + + +define psusr + printf "address\t\tstate\t\tuid\tpid\tppid\tcomm\n" + set $init_t = &init_task + set $tasks_off=((size_t)&((struct task_struct *)0)->tasks) + set $next_t=(((char *)($init_t->tasks).next) - $tasks_off) + + while ($next_t != $init_t) + set $next_t=(struct task_struct *)$next_t + printf "0x%08X\t", $next_t + __show_state $next_t + printf "%d\t%d\t%d\t%s\n", \ + $next_t->uid, $next_t->pid, \ + $next_t->parent->pid, $next_t->comm + set $next_t=(char *)($next_t->tasks.next) - $tasks_off + end + + printf "address\t\tstate\t\tuid\tpid\tppid\tcomm\n" + printf "----end----\n" + +end +document psusr +print information for all tasks, but not including thread members. +This command looks like "ps -aux" in userspace. +end + + +define pskern + printf "address\t\tstate\t\tuid\tpid\tppid\tcomm\n" + set $init_t = &init_task + printf "0x%08X\t", $init_t + __show_state $init_t + printf "%d\t%d\t%d\t%s\n", \ + $init_t->uid, $init_t->pid, \ + $init_t->parent->pid, $init_t->comm + + set $tasks_off=((size_t)&((struct task_struct *)0)->tasks) + set $thread_off=((size_t)&((struct task_struct *)0)->thread_group.next) + set $next_t=(((char *)($init_t->tasks).next) - $tasks_off) + + while ($next_t != $init_t) + set $next_t=(struct task_struct *)$next_t + + printf "0x%08X\t", $next_t + __show_state $next_t + printf "%d\t%d\t%d\t%s\n", \ + $next_t->uid, $next_t->pid, \ + $next_t->parent->pid, $next_t->comm + + set $next_th=(((char *)$next_t->thread_group.next) - $thread_off) + + while ($next_th != $next_t) + set $next_th=(struct task_struct *)$next_th + + printf "0x%08X\t", $next_th + __show_state $next_th + printf "%d\t%d\t%d\t%s\n", \ + $next_th->uid, $next_th->pid, \ + $next_th->parent->pid, $next_th->comm + + set $next_th=(((char *)$next_th->thread_group.next) - $thread_off) + end + + set $next_t=(char *)($next_t->tasks.next) - $tasks_off + end + + printf "address\t\tstate\t\tuid\tpid\tppid\tcomm\n" + printf "----end----\n" + +end +document pskern +print infor for all tasks viewed in kernel, including all thread members +and swapper(PID==0). +end + + +define __prinfo_nobp + printf "\npid %d; addr:0x%08x; comm %s:\n", \ + $arg0.pid, $arg0, $arg0.comm + printf "=====================================\n" + set var $stackp = $arg0.thread.sp + set var $stack_top = ($stackp & ~4095) + 4096 + + while ($stackp < $stack_top) + if (*($stackp) > _stext && *($stackp) < _sinittext) + info symbol *($stackp) + end + set $stackp += 4 + end +end +document __prinfo_nobp +internal macro, don't call it by hand. +end + + define bttnobp set $tasks_off=((size_t)&((struct task_struct *)0)->tasks) - set $pid_off=((size_t)&((struct task_struct *)0)->pids[1].pid_list.next) + set $thread_off=((size_t)&((struct task_struct *)0)->thread_group.next) set $init_t=&init_task set $next_t=(((char *)($init_t->tasks).next) - $tasks_off) + while ($next_t != $init_t) set $next_t=(struct task_struct *)$next_t - printf "\npid %d; comm %s:\n", $next_t.pid, $next_t.comm - printf "===================\n" - set var $stackp = $next_t.thread.esp - set var $stack_top = ($stackp & ~4095) + 4096 - - while ($stackp < $stack_top) - if (*($stackp) > _stext && *($stackp) < _sinittext) - info symbol *($stackp) - end - set $stackp += 4 - end - set $next_th=(((char *)$next_t->pids[1].pid_list.next) - $pid_off) + __prinfo_nobp $next_t + set $next_th=(((char *)$next_t->thread_group.next) - $thread_off) while ($next_th != $next_t) set $next_th=(struct task_struct *)$next_th - printf "\npid %d; comm %s:\n", $next_t.pid, $next_t.comm - printf "===================\n" - set var $stackp = $next_t.thread.esp - set var $stack_top = ($stackp & ~4095) + 4096 - - while ($stackp < $stack_top) - if (*($stackp) > _stext && *($stackp) < _sinittext) - info symbol *($stackp) - end - set $stackp += 4 - end - set $next_th=(((char *)$next_th->pids[1].pid_list.next) - $pid_off) + __prinfo_nobp $next_th + set $next_th=(((char *)$next_th->thread_group.next) - $thread_off) end set $next_t=(char *)($next_t->tasks.next) - $tasks_off end @@ -54,42 +161,41 @@ document bttnobp dump all thread stack traces on a kernel compiled with !CONFIG_FRAME_POINTER end + +define __prinfo + printf "\npid %d; addr:0x%08x; comm %s:\n", \ + $arg0.pid, $arg0, $arg0.comm + printf "=====================================\n" + set var $stackp = $arg0.thread.sp + set var $stack_top = ($stackp & ~4095) + 4096 + set var $stack_bot = ($stackp & ~4095) + + set $stackp = *($stackp) + while (($stackp < $stack_top) && ($stackp > $stack_bot)) + set var $addr = *($stackp + 4) + info symbol $addr + set $stackp = *($stackp) + end +end +document __prinfo +internal macro, don't call it by hand. +end + + define btt set $tasks_off=((size_t)&((struct task_struct *)0)->tasks) - set $pid_off=((size_t)&((struct task_struct *)0)->pids[1].pid_list.next) + set $thread_off=((size_t)&((struct task_struct *)0)->thread_group.next) set $init_t=&init_task set $next_t=(((char *)($init_t->tasks).next) - $tasks_off) + while ($next_t != $init_t) set $next_t=(struct task_struct *)$next_t - printf "\npid %d; comm %s:\n", $next_t.pid, $next_t.comm - printf "===================\n" - set var $stackp = $next_t.thread.esp - set var $stack_top = ($stackp & ~4095) + 4096 - set var $stack_bot = ($stackp & ~4095) - - set $stackp = *($stackp) - while (($stackp < $stack_top) && ($stackp > $stack_bot)) - set var $addr = *($stackp + 4) - info symbol $addr - set $stackp = *($stackp) - end - - set $next_th=(((char *)$next_t->pids[1].pid_list.next) - $pid_off) + __prinfo $next_t + set $next_th=(((char *)$next_t->thread_group.next) - $thread_off) while ($next_th != $next_t) set $next_th=(struct task_struct *)$next_th - printf "\npid %d; comm %s:\n", $next_t.pid, $next_t.comm - printf "===================\n" - set var $stackp = $next_t.thread.esp - set var $stack_top = ($stackp & ~4095) + 4096 - set var $stack_bot = ($stackp & ~4095) - - set $stackp = *($stackp) - while (($stackp < $stack_top) && ($stackp > $stack_bot)) - set var $addr = *($stackp + 4) - info symbol $addr - set $stackp = *($stackp) - end - set $next_th=(((char *)$next_th->pids[1].pid_list.next) - $pid_off) + __prinfo $next_th + set $next_th=(((char *)$next_th->thread_group.next) - $thread_off) end set $next_t=(char *)($next_t->tasks.next) - $tasks_off end @@ -101,7 +207,7 @@ end define btpid set var $pid = $arg0 set $tasks_off=((size_t)&((struct task_struct *)0)->tasks) - set $pid_off=((size_t)&((struct task_struct *)0)->pids[1].pid_list.next) + set $thread_off=((size_t)&((struct task_struct *)0)->thread_group) set $init_t=&init_task set $next_t=(((char *)($init_t->tasks).next) - $tasks_off) set var $pid_task = 0 @@ -113,29 +219,19 @@ define btpid set $pid_task = $next_t end - set $next_th=(((char *)$next_t->pids[1].pid_list.next) - $pid_off) + set $next_th=(((char *)$next_t->thread_group.next) - $thread_off) while ($next_th != $next_t) set $next_th=(struct task_struct *)$next_th if ($next_th.pid == $pid) set $pid_task = $next_th end - set $next_th=(((char *)$next_th->pids[1].pid_list.next) - $pid_off) + set $next_th=(((char *)$next_th->thread_group.next) - $thread_off) end set $next_t=(char *)($next_t->tasks.next) - $tasks_off end - printf "\npid %d; comm %s:\n", $pid_task.pid, $pid_task.comm - printf "===================\n" - set var $stackp = $pid_task.thread.esp - set var $stack_top = ($stackp & ~4095) + 4096 - set var $stack_bot = ($stackp & ~4095) - - set $stackp = *($stackp) - while (($stackp < $stack_top) && ($stackp > $stack_bot)) - set var $addr = *($stackp + 4) - info symbol $addr - set $stackp = *($stackp) - end + __prinfo $pid_task + end document btpid backtrace of pid @@ -145,7 +241,7 @@ end define trapinfo set var $pid = $arg0 set $tasks_off=((size_t)&((struct task_struct *)0)->tasks) - set $pid_off=((size_t)&((struct task_struct *)0)->pids[1].pid_list.next) + set $thread_off=((size_t)&((struct task_struct *)0)->thread_group.next) set $init_t=&init_task set $next_t=(((char *)($init_t->tasks).next) - $tasks_off) set var $pid_task = 0 @@ -157,13 +253,13 @@ define trapinfo set $pid_task = $next_t end - set $next_th=(((char *)$next_t->pids[1].pid_list.next) - $pid_off) + set $next_th=(((char *)$next_t->thread_group.next) - $thread_off) while ($next_th != $next_t) set $next_th=(struct task_struct *)$next_th if ($next_th.pid == $pid) set $pid_task = $next_th end - set $next_th=(((char *)$next_th->pids[1].pid_list.next) - $pid_off) + set $next_th=(((char *)$next_th->thread_group.next) - $thread_off) end set $next_t=(char *)($next_t->tasks.next) - $tasks_off end -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html