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. 물론 추적을 비활성화할 때까지 계속해서 새로운 이벤트를 받게 됩니다.

관련 정보