0

trace-cmd がオフ ftrace の raw ファイルをゼロ コピーするために使用する splice syscall を試してみたかったのです。

以下は、splice が読み取りに失敗する ftrace raw ファイルの部分的なリストです。

/sys/kernel/debug/tracing/per_cpu/cpo0/trace_pipe_raw

/sys/kernel/debug/tracing/per_cpu/cpo0/snapshot_raw

/sys/kernel/debug/tracing/per_cpu/cpo1/trace_pipe_raw

/sys/kernel/debug/tracing/per_cpu/cpo1/snapshot_raw

そして、ここにいくつかの他のファイルがあります(スプライスは問題なく処理します):

/sys/kernel/debug/tracing/per_cpu/cpo0/trace_pipe

/sys/カーネル/デバッグ/トレース/per_cpu/cpo0/スナップショット

/sys/kernel/debug/tracing/per_cpu/cpo1/trace_pipe

/sys/カーネル/デバッグ/トレース/per_cpu/cpo1/スナップショット

機能するもの:

  • read() システム コールを使用すると、生の ftrace ファイルから読み取ることができます。
  • cat() システム コールを使用すると、生の ftrace ファイルが表示されます。
  • ftrace の CLI フロントエンドである trace-cmd ツールを使用します。

これは私のコードです:

static void unit_test_x(void)
{  
    int buffer_pipe[2];
    pipe(buffer_pipe);

    std::string source_path = "/sys/kernel/debug/tracing/per_cpu/cpu1/trace_pipe_raw";
    int trace_fd = open(source_path.c_str(), O_RDONLY);

    std::string destination_path = "foo";
    int dest_fd = open (destination_path.c_str(), O_WRONLY | O_CREAT | O_TRUNC | O_LARGEFILE, 0644);

    int actually_read = splice(trace_fd,
                               NULL,
                               buffer_pipe[1],
                               NULL,
                               1000,
                               SPLICE_F_MORE | SPLICE_F_MOVE );

    if (0 > actually_read )
    {   
        printf("Oh dear, something went wrong %s\n", s  trerror(errno));
        throw std::runtime_error("writing from source to pipe failed");
    }

    actually_read = splice(buffer_pipe[0],
                           NULL,
                           dest_fd,
                           NULL,
                           actually_read,
                           SPLICE_F_MORE | SPLICE_F_MOVE);

}

ノート:

/sys/kernel/debug/tracing へのすべてのアクセスは sudo で行われます

4

1 に答える 1