如何在ftrace中用trace marker记录用户事件?WR_ONLY编译未定义
解决ftrace trace_marker编译错误:WR_ONLY未定义
你遇到的编译错误是因为用错了open系统调用的权限宏——正确的宏是O_WRONLY,不是WR_ONLY。这个宏是Linux/Unix系统中标准的文件打开标志,定义在<fcntl.h>头文件里。
下面是完整的修正方案,还补上了必要的头文件和错误处理(避免踩更多坑):
修正后的代码
#include <fcntl.h> // 包含O_WRONLY、O_CLOEXEC等宏 #include <unistd.h> // 包含write、open函数 #include <stdarg.h> // 包含va_list相关宏 #include <stdio.h> // 包含vsnprintf函数 #include <stdlib.h> // 可选,用于perror打印错误 static int trace_fd = -1; void trace_write(const char *fmt, ...) { va_list ap; char buf[256]; int n; if (trace_fd < 0) return; va_start(ap, fmt); n = vsnprintf(buf, sizeof(buf), fmt, ap); va_end(ap); // 注意:write可能会部分写入,这里简化处理,实际可以循环写入直到完成 write(trace_fd, buf, n); } // 初始化trace_marker的函数示例 void trace_init(void) { // 注意:trace_marker的绝对路径通常是/sys/kernel/debug/tracing/trace_marker // 相对路径可能会因为程序运行目录不同导致打开失败 trace_fd = open("/sys/kernel/debug/tracing/trace_marker", O_WRONLY | O_CLOEXEC); if (trace_fd < 0) { perror("Failed to open trace_marker"); // 可以根据需求选择退出或者继续运行 // exit(EXIT_FAILURE); } } // 清理函数示例 void trace_cleanup(void) { if (trace_fd >= 0) { close(trace_fd); trace_fd = -1; } }
关键修正点说明
- 替换宏名:把
WR_ONLY改为O_WRONLY,这是编译错误的直接原因。 - 添加必要头文件:确保包含
<fcntl.h>(获取open的标志宏)、<unistd.h>(获取open/write系统调用)等,否则即使宏名对了,也可能出现函数未声明的警告/错误。 - 使用绝对路径:
trace_marker位于debugfs挂载的/sys/kernel/debug/tracing/目录下,用相对路径大概率会打开失败,所以建议写绝对路径。 - 添加
O_CLOEXEC标志:这是个好习惯,避免子进程意外继承这个文件描述符,防止不必要的资源泄漏。 - 错误处理:检查open的返回值,打印错误信息,方便排查问题(比如没有权限访问debugfs,或者ftrace未挂载)。
额外提示
要使用trace_marker,需要确保:
- debugfs已经挂载:可以用
mount -t debugfs none /sys/kernel/debug挂载(需要root权限)。 - 当前进程有访问
/sys/kernel/debug/tracing/目录的权限(通常需要root或者添加对应的权限组)。
内容的提问来源于stack exchange,提问作者UserM UserLM
相关产品推荐
相关产品推荐

