【问题标题】:access a process's kernel stack given process id in kernel debugging在内核调试中访问给定进程 ID 的进程的内核堆栈
【发布时间】:2012-03-02 06:09:14
【问题描述】:

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

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

  1. 给定pid,如何获取task_struct对应的进程?我尝试在 gdb 下执行“ p find_task_by_pid_ns(2533, &init_pid_ns) ”,但它挂起。

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

谢谢。

【问题讨论】:

  • 但是你只需要你的进程(用户空间)堆栈。或者你是在调试一个内核模块,还是只是你的应用程序???
  • 我在调试内核时需要内核栈

标签: linux debugging gdb linux-kernel kernel


【解决方案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   

【讨论】:

    猜你喜欢
    • 2015-06-26
    • 1970-01-01
    • 2020-04-24
    • 2017-09-19
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 2017-10-11
    • 1970-01-01
    相关资源
    最近更新 更多