我正在使用bpf_printk()
帮助程序打印到内核调试来跟踪一些 BPF 程序。用法如下:
#include <stdio.h>
#include <linux/bpf.h>
#include <sys/socket.h>
#include <bpf/bpf_helpers.h>
char LICENSE[] SEC("license") = "GPL";
SEC("sk_msg")
int http_state_machine(struct sk_msg_md *msg) {
long len = (long)msg->data_end - (long)msg->data;
if (len > 0) {
bpf_printk("Message length: %ld\n", len);
}
return SK_PASS;
}
然后我尝试通过读取trace_pipe sudo cat /sys/kernel/debug/tracing/trace_pipe > check.log
。我的目标是仅读取跟踪的前几行,而不是整个跟踪。但是,这需要很长时间(大约几分钟)才能将所有输出移至 check.log 中。
我从中学到了这答案是,trace_pipe 的输出在静态文件中也是相同的/sys/kernel/debug/tracing/trace
。该trace
文件有近10k行。
我的问题是:如何清除trace_pipe
和/或的整个输出trace
- 通过将整个输出移动到新文件或丢弃输出(在读取前几行之后)?
答案1
trace
与trace_pipe
一般来说,trace
并且trace_pipe
有相同的数据。不同的是,它trace
是静态的;事件不会从中删除,只是附加(直到达到缓冲区的大小,您可以在 中显示和设置/sys/kernel/debug/tracing/buffer_size_kb
)。然而,在 中trace_pipe
,一旦您读取某个事件,它就会从该文件中消失(有点像 fifo 队列)。因此,如果您运行cat /sys/kernel/debug/tracing/trace_pipe
,该文件的所有事件都会被清除(至少直到下一个事件为止)。
读自trace_pipe
问题是,该trace_pipe
文件没有EOF(文件结束)。该cat
命令永远不会结束,并且将无限期地等待新事件。也许这就是您认为需要很长时间的原因 - 该命令永远不会完成,要么等待新事件,要么在它们出现时读取它们。
清除缓冲区trace
和trace_pipe
如果您想清除两个文件中的所有事件,您应该简单地写入trace
文件:
$ echo > /sys/kernel/debug/tracing/trace
这将清除trace
和trace_pipe
文件。当然,他们仍然会收到新事件,直到您禁用跟踪。