执行特定命令时的内核堆栈跟踪
当输入像 #ifconfig 10.0.0.10 up 这样的命令时,是否可以看到内核内所有“可能的”打印。
我知道类似 echo t > 的东西/proc/sysrq-trigger 将为您提供有关系统中运行的进程的堆栈跟踪。 我感兴趣的是,对于“特定命令”,我如何获得执行的内核函数(堆栈跟踪)?
我知道像 kgdb 这样的调试器,但我对像 sysrq 方法(如果有的话)这样的快速方法感兴趣。
谢谢。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
你的问题的答案是“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 guest 中安装 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 客户端。
The answer to your question is "ftrace". It is not a tool, not a command, but just a kernel feature built into most modern linux kernel.
For example, here you can use ftrace to understand how swap space are implemented (see all the key functions executed and its sequence inside the pastebin files indicated below):
http://tthtlc.wordpress.com/2013/11/19/using-ftrace-to-understanding-linux-kernel-api/
Read this carefully and you can see there are many ways of using ftrace (one is dump kernel stack trace which you requested, another is identifying executed function flow):
http://lwn.net/Articles/366796/
If you don't want to use ftrace, another option is to use QEMU: installing Linux inside the qemu guest is needed, and it is a lot more powerful, as you can use gdb to step through every lines (in C source code) or assembly.
https://tthtlc.wordpress.com/2014/01/14/how-to-do-kernel-debugging-via-gdb-over-serial-port-via-qemu/
Just in case you want to google further, this is called "kgdb", or gdbserver, and outside the qemu you are running a gdb client.
tail -f /var/log/kern.log
应显示内核中发生的任何交互。它或多或少相当于 dmesg 命令。
tail -f /var/log/kern.log
should display any interaction that occurrs in the kernel.It is more or less an equivalent to the
dmesg
command.strace ifconfig 10.0.0.10 up
将显示 ifconfig 调用的所有系统调用,但不会进入内核的调用strace ifconfig 10.0.0.10 up
will show all system calls called by ifconfig, but will not get inside kernel's calls