On 04/27/16 at 07:21am, Corey Minyard wrote: > Any comments on this? If no one else cares I'd be willing to take over > maintenance of this. Vivek is busy with some other issues. He asked Dave and me to test and review this patch. Will check this recently. Thanks Baoquan > > -corey > > On 02/25/2016 07:51 AM, minyard at acm.org wrote: > >From: Corey Minyard <cminyard at mvista.com> > > > >Lots of little changes needed to be made to clean these up, remove the > >four byte pointer assumption and traverse the pid queue properly. > >Also consolidate the traceback code into a single function instead > >of having three copies of it. > > > >Signed-off-by: Corey Minyard <cminyard at mvista.com> > >--- > > Documentation/kdump/gdbmacros.txt | 90 +++++++++++++++++---------------------- > > 1 file changed, 40 insertions(+), 50 deletions(-) > > > >I sent this earlier, but I didn't get a response. These are clearly > >wrong. I'd be happy to take over maintenance of these macros. It > >might be better to move them someplace else, too, since they are also > >useful for kgdb. > > > >diff --git a/Documentation/kdump/gdbmacros.txt b/Documentation/kdump/gdbmacros.txt > >index 9b9b454..e5bbd8d 100644 > >--- a/Documentation/kdump/gdbmacros.txt > >+++ b/Documentation/kdump/gdbmacros.txt > >@@ -15,14 +15,14 @@ > > 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 $pid_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 $stackp = $next_t.thread.sp > > set var $stack_top = ($stackp & ~4095) + 4096 > > while ($stackp < $stack_top) > >@@ -31,12 +31,12 @@ define bttnobp > > end > > set $stackp += 4 > > end > >- set $next_th=(((char *)$next_t->pids[1].pid_list.next) - $pid_off) > >+ set $next_th=(((char *)$next_t->thread_group.next) - $pid_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 $stackp = $next_t.thread.sp > > set var $stack_top = ($stackp & ~4095) + 4096 > > while ($stackp < $stack_top) > >@@ -45,7 +45,7 @@ define bttnobp > > end > > set $stackp += 4 > > end > >- set $next_th=(((char *)$next_th->pids[1].pid_list.next) - $pid_off) > >+ set $next_th=(((char *)$next_th->thread_group.next) - $pid_off) > > end > > set $next_t=(char *)($next_t->tasks.next) - $tasks_off > > end > >@@ -54,42 +54,43 @@ document bttnobp > > dump all thread stack traces on a kernel compiled with !CONFIG_FRAME_POINTER > > end > >+define btthreadstruct > >+ set var $pid_task = $arg0 > >+ > >+ printf "\npid %d; comm %s:\n", $pid_task.pid, $pid_task.comm > >+ printf "task struct: " > >+ print $pid_task > >+ printf "===================\n" > >+ set var $stackp = $pid_task.thread.sp > >+ set var $stack_top = ($stackp & ~4095) + 4096 > >+ set var $stack_bot = ($stackp & ~4095) > >+ > >+ set $stackp = *((unsigned long *) $stackp) > >+ while (($stackp < $stack_top) && ($stackp > $stack_bot)) > >+ set var $addr = *(((unsigned long *) $stackp) + 1) > >+ info symbol $addr > >+ set $stackp = *((unsigned long *) $stackp) > >+ end > >+end > >+document btthreadstruct > >+ dump a thread stack using the given task structure pointer > >+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 $pid_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) > >+ btthreadstruct $next_t > >- 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) > >+ set $next_th=(((char *)$next_t->thread_group.next) - $pid_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) > >+ btthreadstruct $next_th > >+ set $next_th=(((char *)$next_th->thread_group.next) - $pid_off) > > end > > set $next_t=(char *)($next_t->tasks.next) - $tasks_off > > end > >@@ -101,7 +102,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 $pid_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 > >@@ -113,29 +114,18 @@ 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) - $pid_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) - $pid_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 > >+ btthreadstruct $pid_task > > end > > document btpid > > backtrace of pid > >@@ -145,7 +135,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 $pid_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 +147,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) - $pid_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) - $pid_off) > > end > > set $next_t=(char *)($next_t->tasks.next) - $tasks_off > > end