Linux 执行特定命令时的内核堆栈跟踪

Linux 执行特定命令时的内核堆栈跟踪,linux,debugging,kernel,Linux,Debugging,Kernel,当键入像#ifconfig 10.0.0.10 up这样的命令时,可以在内核中看到所有“可能”的打印 我知道类似echo t>/proc/sysrq trigger的东西将为您提供有关系统中运行的进程的堆栈跟踪。 我感兴趣的是,关于“特定命令”,我如何获得执行的内核函数(堆栈跟踪) 我知道kgdb之类的调试器,但我对sysrq之类的快速方法感兴趣 谢谢。tail-f/var/log/kern.log应该显示内核中发生的任何交互。 它或多或少相当于dmesg命令。tail-f/var/log/ke

当键入像#ifconfig 10.0.0.10 up这样的命令时,可以在内核中看到所有“可能”的打印

我知道类似echo t>/proc/sysrq trigger的东西将为您提供有关系统中运行的进程的堆栈跟踪。 我感兴趣的是,关于“特定命令”,我如何获得执行的内核函数(堆栈跟踪)

我知道kgdb之类的调试器,但我对sysrq之类的快速方法感兴趣


谢谢。

tail-f/var/log/kern.log应该显示内核中发生的任何交互。

它或多或少相当于
dmesg
命令。

tail-f/var/log/kern.log
应显示内核中发生的任何交互。

它或多或少相当于dmesg命令。

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

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

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

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

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

如果您不想使用ftrace,另一个选择是使用QEMU:需要在QEMU客户机中安装Linux,而且它的功能要强大得多,因为您可以使用gdb逐步完成每一行(在C源代码中)或程序集


为了防止你想用谷歌进一步搜索,这被称为“kgdb”,或gdbserver,在qemu之外,你正在运行一个gdb客户端。

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

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

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

如果您不想使用ftrace,另一个选择是使用QEMU:需要在QEMU客户机中安装Linux,而且它的功能要强大得多,因为您可以使用gdb逐步完成每一行(在C源代码中)或程序集


为了防止您想进一步搜索,这被称为“kgdb”,或gdbserver,在qemu之外您正在运行一个gdb客户端。

您可以在
/proc//stack
文件中查看进程的内核堆栈。但是,我不知道如何在命令运行时记录该文件中的更改。您是说获取系统调用的代码流跟踪,例如->syscall dispatcher->ioctl->设备ioctl for socket->tcp驱动程序->等等。。。,您可以在
/proc//stack
文件中查看进程的内核堆栈。但是,我不知道如何在命令运行时记录该文件中的更改。您是说获取系统调用的代码流跟踪,例如->syscall dispatcher->ioctl->device ioctl for socket->tcp driver->……,然后再次返回?