使用trace-cmd/ftrace,在发生panic()之前获取function_graph。

9
我正在尝试使用trace-cmd来收集有关我所看到的内核崩溃的更多信息。不幸的是,内核崩溃并显示“kernel panic - not syncing”消息(即套接字和文件缓冲区未被刷新,因此在崩溃时缓冲区中的任何内容都将不可避免地丢失)。 有没有一种方法可以:
  1. 强制trace-cmd进程将其缓冲区刷新到文件系统或套接字? 或者
  2. 使trace-cmd / ftrace避免缓冲(即在后台调用printk()并使用netconsole)?
由于我在虚拟化环境中运行trace-cmd命令,因此我不介意硬盘可能偶尔会损坏,因为我可以简单地恢复到最后一个良好的快照或重新部署VM。
1个回答

2

我不能保证我的配方能帮到你,但谁知道呢 :)

首先尝试取消所有trace-cmd的输出缓冲。你可以在这里找到一些做法:https://unix.stackexchange.com/questions/25372/turn-off-buffering-in-pipe

其次,内核处理在崩溃时写入FS非常危险,这是可以理解的,但你可以尝试在崩溃之前将最后的信息存储在崩溃机器外部。尝试将关键信息重定向到串口或网络连接,并在另一端捕获它。像这样:

unbuffer trace-cmd >/dev/ttyS0

另一种方法是尽量避免恐慌,让内核工作更长时间,但结果不可预测。您可以针对几种情况禁用恐慌。查看/proc/sys/kernel/目录中的panic_on_*设置。有关详细信息,请参阅“/proc/sys/kernel/的文档”。

这并没有解决问题,因为我相信在ftrace和trace-cmd之间还有另一个缓冲区。unbuffer仅对STDOUT进行了取消缓冲,对吗? - user389238
当然可以。这种方法只是试图减少缓冲。另一种方法是尽量避免恐慌,让内核工作更长时间,但结果不可预测。 您可以禁用几种情况下的恐慌。请查看“/proc/sys/kernel/*”中的“panic_on_*”设置的“文档”(https://www.kernel.org/doc/Documentation/sysctl/kernel.txt)。 - MrCryo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接