我在VMWare上运行了一个linux,我在主机上使用gdb在调试时附加到它。在运行时,我的内核将导致一些进程挂起,我想调查更多。
内核给我的是挂起进程的进程ID以及堆栈跟踪。但是,如果没有传递参数,堆栈跟踪就不是很有用。所以我想收集更多信息。所以我有两个问题:
鉴于pid,我怎样才能让task_struct对应于进程?我尝试在gdb下执行“p find_task_by_pid_ns(2533,& init_pid_ns)”,但它会挂起。
一旦我得到了task_struct和堆栈指针。我的最终目标是重现堆栈跟踪(使用每个被调用函数的参数)。有没有工具可以做到这一点? gdb是否采用堆栈指针并为我打印堆栈跟踪?
感谢。
答案 0 :(得分:1)
KDB在这种情况下会有所帮助。我不知道您使用的是哪个内核版本,但如果您在linux-2.6.35之后或之后使用内核,则可以使用以下命令从gdb切换到kdb:
maintenance packet 3
进入kdb后,您可以使用ps命令了解进程描述符地址,并可以使用bt命令跟踪堆栈。或者,您可以使用gdb'monitor'命令从gdb运行kdb命令。例如,要使用kdb的'ps'命令,可以在gdb中键入以下命令。
(gdb) monitor ps
您可以使用以下命令获取kdb命令列表。
(gdb) monitor help
一旦知道了进程描述符,就可以使用以下文档来跟踪任何进程的堆栈。
http://www.emntech.com/documentation/debugging/kdb.pdf