trace与trace_pipe

trace与trace_pipe

我正在使用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

tracetrace_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命令永远不会结束,并且将无限期地等待新事件。也许这就是您认为需要很长时间的原因 - 该命令永远不会完成,要么等待新事件,要么在它们出现时读取它们。

清除缓冲区tracetrace_pipe

如果您想清除两个文件中的所有事件,您应该简单地写入trace文件:

$ echo > /sys/kernel/debug/tracing/trace

这将清除tracetrace_pipe文件。当然,他们仍然会收到新事件,直到您禁用跟踪。

相关内容