Я хотел попробовать системный вызов сплайсинга, который trace-cmd использует для обнуления необработанных файлов без ftrace.
Вот неполный список, который не может прочитать сплайс необработанных файлов ftrace:
/ 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 / kernel / debug / tracing / per_cpu / cpo0 / snapshot
/ sys / kernel / debug / tracing / per_cpu / cpo1 / trace_pipe
/ sys / kernel / debug / tracing / per_cpu / cpo1 / snapshot
Что работает:
- при использовании системного вызова read () прекрасно работает для чтения из необработанных файлов ftrace.
- при использовании системного вызова cat () отображаются необработанные файлы ftrace.
- используя т инструмент race-cmd, который является интерфейсом CLI для ftrace.
Это мой код:
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);
}
note:
Все доступ к / sys / kernel / debug / tracing выполняется с помощью sudo