在内核调试中访问进程的内核堆栈给定进程ID

时间:2012-03-02 06:09:14

标签: linux debugging gdb linux-kernel kernel

我在VMWare上运行了一个linux,我在主机上使用gdb在调试时附加到它。在运行时,我的内核将导致一些进程挂起,我想调查更多。

内核给我的是挂起进程的进程ID以及堆栈跟踪。但是,如果没有传递参数,堆栈跟踪就不是很有用。所以我想收集更多信息。所以我有两个问题:

  1. 鉴于pid,我怎样才能让task_struct对应于进程?我尝试在gdb下执行“p find_task_by_pid_ns(2533,& init_pid_ns)”,但它会挂起。

  2. 一旦我得到了task_struct和堆栈指针。我的最终目标是重现堆栈跟踪(使用每个被调用函数的参数)。有没有工具可以做到这一点? gdb是否采用堆栈指针并为我打印堆栈跟踪?

  3. 感谢。

1 个答案:

答案 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