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
。もちろん、追跡を無効にするまで新しいイベントを受け取ります。