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には約10,000行があります。

私の質問は:出力全体を新しいファイルに移動したり(最初の数行を読んだ後)、出力を削除して出力を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。もちろん、追跡を無効にするまで新しいイベントを受け取ります。

関連情報