ftrace在应用上的使用

2023-10-17 14:14:17 浏览数 (2)

之前介绍通过命令行配置和使用ftrace功能,但是实际中,我们也会希望抓C/C 程序中某段代码的调度情况。笔者前不久就遇到这种问题,某个函数调用时延概率超过100ms,是为什么?这时候就需要在他们代码中使能ftrace抓执行此函数时候,任务的调度情况。

观察某段代码执行过程中的情况,ftrace提供了trace markers功能,可通过写入trace_marker接口在ftrace中留下记录。如下

代码语言:javascript复制
[tracing]# echo hello world > trace_marker

    [tracing]# cat trace

    # tracer: nop

    #

    #           TASK-PID    CPU#    TIMESTAMP  FUNCTION

    #              | |       |          |         |

               <...>-3718  [001]  5546.183420: 0: hello world

利用tracing_on和trace_marker接口,可以很好的trace任务的执行情况(前提是任务源码可见)。

代码语言:javascript复制
int main()

{

    int fd_mark = open("/sys/kernel/debug/tracing/trace_marker", O_CREAT|O_RDWR, 0666);

    int fd_trace = open("/sys/kernel/debug/tracing/tracing_on", O_CREAT|O_RDWR, 0666);

    /* enable trace */

    write(fd_trace, "1", 2);

    /* add trace mark */

    write(fd_mark, "start time", 11);

    /* Run something */



    /* add trace mark */

    write(fd_mark, "end time", 11);

    /* disable trace */

    write(fd_trace, "0", 2);

    close(fd_mark);

    close(fd_trace);

}

可参考如上代码,在自己程序中动态使能和关闭ftrace,并在希望的位置添加markers。

0 人点赞