【问题标题】:kernel stack trace while carrying out specific command执行特定命令时的内核堆栈跟踪
【发布时间】:2011-09-29 12:57:50
【问题描述】:

在键入 #ifconfig 10.0.0.10 up 之类的命令时,是否可以在内核中看到所有“可能的”打印。

我知道像 echo t > /proc/sysrq-trigger 这样的东西会给你关于系统中运行的进程的堆栈跟踪。 我感兴趣的是,关于“特定命令”,我怎样才能获得执行的内核函数(堆栈跟踪)?

我知道像 kgdb 这样的调试器,但我对像 sysrq 方法这样的快速方法很感兴趣。

谢谢。

【问题讨论】:

  • 你可以在/proc/<PID>/stack文件中查看一个进程的内核栈。但是,我不知道如何在您的命令运行时记录该文件中的更改。
  • 你说的是获取系统调用的代码流跟踪,例如 -> syscall dispatcher -> ioctl -> device ioctl for socket -> tcp driver -> ... ,然后再次离开那里?

标签: linux debugging kernel


【解决方案1】:

您的问题的答案是“ftrace”。它不是工具,也不是命令,而只是大多数现代 linux 内核中内置的内核特性。

例如,您可以在这里使用 ftrace 来了解交换空间是如何实现的(请参阅下面显示的 pastebin 文件中执行的所有关键函数及其顺序):

http://tthtlc.wordpress.com/2013/11/19/using-ftrace-to-understanding-linux-kernel-api/

仔细阅读,您会发现使用 ftrace 的方法有很多种(一种是您请求的转储内核堆栈跟踪,另一种是识别已执行的函数流):

http://lwn.net/Articles/366796/

如果您不想使用 ftrace,另一种选择是使用 QEMU:需要在 qemu 客户机中安装 Linux,而且它更强大,因为您可以使用 gdb 单步执行每一行(在 C源代码)或程序集。

https://tthtlc.wordpress.com/2014/01/14/how-to-do-kernel-debugging-via-gdb-over-serial-port-via-qemu/

以防万一您想进一步搜索,这称为“kgdb”或 gdbserver,并且在 qemu 之外您正在运行 gdb 客户端。

【讨论】:

    【解决方案2】:

    strace ifconfig 10.0.0.10 up 将显示 ifconfig 调用的所有系统调用,但不会进入内核调用

    【讨论】:

      【解决方案3】:

      tail -f /var/log/kern.log 应该显示内核中发生的任何交互。
      它或多或少等同于dmesg 命令。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-12
        • 1970-01-01
        • 2019-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-19
        • 1970-01-01
        相关资源
        最近更新 更多