zoukankan      html  css  js  c++  java
  • ftrace用法

    ftrace官方文档在kernel/Documentation/trace/ftrace.txt文件中。

    使用ftrace接口之前,如果系统没有自动挂载debugfs文件系统,则要先手动挂载。

    # mount -t debugfs nodev /sys/kernel/debug

    ftracer的目录为/sys/kernel/debug/tracing,下面介绍这个目录下的常用文件:

    tracing_on,启用/禁用向追踪缓冲区写入功能。1为启用,0为禁用。

    available_tracers,当前内核中可用的插件追踪器。

    current_tracer,指定当前要使用的插件追踪器。

    tracing_cpumask,以十六进制的位掩码指定要作为追踪对象的处理器,例如,指定0xb时仅在处理器0、1、3上进行追踪。

    set_ftrace_pid,指定作为追踪对象的进程的PID号。

    trace,以文本格式输出内核中追踪缓冲区的内容。

    trace_pipe,与trace相同,但是运行时像管道一样,可以在每次事件发生时读出追踪信息,但是读出的内容不能再次读出。

    buffer_size_kb,以KB为单位指定各个CPU追踪缓冲区的大小。系统追踪缓冲区的总大小就是这个值乘以CPU的数量。设置buffer_size_kb时,必须设置current_tracer为nop追踪器。

    set_ftrace_filter,指定要追踪的函数名称,函数名称仅可以包含一个通配符。

    set_ftrace_notrace,指定不要追踪的函数名称。

    ftrace可以使用的插件追踪器主要有:

    function,函数调用追踪器,可以看出哪个函数何时调用。

    function_graph,函数调用图表追踪器,可以看出哪个函数被哪个函数调用,何时返回。

    mmiotrace,MMIO( Memory MappedI/O)追踪器,用于Nouveau驱动程序等逆向工程。

    blk,block I/O追踪器。

    wakeup,进程调度延迟追踪器。

    wakeup_rt,与wakeup相同,但以实时进程为对象。

    irqsoff,当中断被禁止时,系统无法响应外部事件,造成系统响应延迟,irqsoff跟踪并记录内核中哪些函数禁止了中断,对于其中禁止中断时间最长的,irqsoff将在log文件的第一行标示出来,从而可以迅速定位造成系统响应延迟的原因。

    preemptoff,追踪并记录禁止内核抢占的函数,并清晰显示出禁止内核抢占时间最长的函数。

    preemptirqsoff,追踪并记录禁止内核抢占和中断时间最长的函数。

    sched_switch,进行上下文切换的追踪,可以得知从哪个进程切换到了哪个进程。

    nop,不执行任何操作。不使用插件追踪器时指定。

    ftrace使用举例:追踪进程调度函数schedule是由哪个函数调用的。

    1、  查看available_tracers的内容,确定当前内核是否支持记录函数调用的函数追踪器:

    root@thinker:/sys/kernel/debug/tracing# cat  available_tracers

    blk function_graph mmiotrace wakeup_rtwakeup function nop

    可以看到,available_tracers中包含function,即函数追踪器。

    2、  一旦将函数追踪器启动,ftrace会记录所有函数的运行情况,但是我们只想查看schedule函数的调用情况,因此先设置函数过滤器,仅记录schedule:

    root@thinker:/sys/kernel/debug/tracing#echo schedule > set_ftrace_filter

    3、  将函数追踪器function写入current_tracer文件:

    root@thinker:/sys/kernel/debug/tracing#echo function > current_tracer

    4、  追踪结果可以从trace文件读出:

    root@thinker:/sys/kernel/debug/tracing#head trace

    # tracer: function

    #

    #           TASK-PID    CPU#   TIMESTAMP  FUNCTION

    #              | |       |          |         |

               bash-29903 [003] 262746.977929: schedule <-sysret_careful

        kworker/3:1-239   [003]262746.977937: schedule <-worker_thread

             <idle>-0     [000]262746.977940: schedule <-cpu_idle

               bash-29903 [003] 262746.977943: schedule <-schedule_timeout

               sshd-2562  [000] 262746.977994:schedule <-schedule_hrtimeout_range_clock

             <idle>-0     [003]262746.979523: schedule <-cpu_idle

    可以看出,bash, kworker,idle,sshd这几个进程的相应函数调用了schedule函数。

    可以使用多个函数名称或通配符向过滤器指定模式、模块。例如:

    root@thinker:/sys/kernel/debug/tracing#echo ‘irq*’ > set_ftrace_filter

    可以记录函数名以irq开头的所有函数调用。

    另外,在参数前面加上:mod:,可以仅追踪指定模块中包含的函数(注意,模块必须已经加载)。例如:

    root@thinker:/sys/kernel/debug/tracing# echo 'write*:mod:ext3' > set_ftrace_filter

    仅追踪ext3模块中包含的以write开头的函数。

    要清空trace的内容执行如下命令:

    # echo 0 > tracing_on

    # echo 0 > trace

    # cat  trace

    trace_printk打印调试信息后,将current_tracer设置为nop,将tracing_on设置为1,调用相应模块执行,即可通过trace文件看到trace_printk打印的信息。

  • 相关阅读:
    项目管理
    开源视频会议bigbluebutton开发(1)——初始化安装以及配置
    oracle休系统结构
    Tomcat上安装配置Axis
    锁表头
    文件复制三种方法
    程序员技术练级攻略
    Linux (RHEL 5.4)下安装 Oracle 10g R2
    Android 学习资料收集汇总
    WAS61安装调整和应用部署.doc
  • 原文地址:https://www.cnblogs.com/jefree/p/4438975.html
Copyright © 2011-2022 走看看