You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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,需要确保:

  1. debugfs已经挂载:可以用mount -t debugfs none /sys/kernel/debug挂载(需要root权限)。
  2. 当前进程有访问/sys/kernel/debug/tracing/目录的权限(通常需要root或者添加对应的权限组)。

内容的提问来源于stack exchange,提问作者UserM UserLM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:51:40