怎么在ftrace中监视自己的函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么在ftrace中监视自己的函数相关的知识,希望对你有一定的参考价值。

参考技术A 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,不执行任何操作。不使用插件追踪器时指定。
参考技术B 1
1
1
1
1

使用 ftrace 的 android 内核函数跟踪?

【中文标题】使用 ftrace 的 android 内核函数跟踪?【英文标题】:android kernel function trace using ftrace? 【发布时间】:2013-08-27 11:51:45 【问题描述】:

当我们要跟踪gs4的内核函数时想使用ftrace。

所以,我接受了这里的内容。

http://www.linuxforu.com/2010/11/kernel-tracing-with-ftrace-part-1/

mount -t debugfs nodev /sys/kernel/debug

当你输入命令时,出来如下。

root@android:/sys/kernel/debug/tracing # mount -t debugfs nodev /nodev /sys/kernel/debug
mount: Device or resource busy

还有,

root@android:/sys/kernel/debug/tracing # cat current_tracer
nop
root@android:/sys/kernel/debug/tracing # echo function > current_tracer
root@android:/sys/kernel/debug/tracing # cat current_tracer
nop

这样出来。

root@android:/sys/kernel/debug/tracing # ls -al current_tracer
-rw-r--r-- root     root            0 2013-08-27 20:32 current_tracer

最后更新时间会改变, 无法更改 currnet_tracer 的内容。

当然,出来如下。

root@android:/sys/kernel/debug/tracing # cat trace
# tracer: nop
#
# entries-in-buffer/entries-written: 0/0   #P:1
#
#                              _-----=> irqs-off
#                             / _----=> need-resched
#                            | / _---=> hardirq/softirq
#                            || / _--=> preempt-depth
#                            ||| /     delay
#           TASK-PID   CPU#  ||||    TIMESTAMP  FUNCTION
#              | |       |   ||||       |         |

我无法更改 currnet_tracer。 tracking_on 能够改变。

root@android:/sys/kernel/debug/tracing # cat tracing_on
0
root@android:/sys/kernel/debug/tracing # echo 1 > tracing_on
root@android:/sys/kernel/debug/tracing # cat tracing_on
1
root@android:/sys/kernel/debug/tracing #

我可以用atrace,我根据对应选项出来的信息如下,想跟踪内核函数的调用。

root@android:/sys/kernel/debug/tracing # atrace -s -w capturing trace < /test/trace.txt
root@android:/sys/kernel/debug/tracing # cat /test/trace.txt
capturing trace... done
TRACE:
# tracer: nop
#
# entries-in-buffer/entries-written: 532/532   #P:1
#
#                              _-----=> irqs-off
#                             / _----=> need-resched
#                            | / _---=> hardirq/softirq
#                            || / _--=> preempt-depth
#                            ||| /     delay
#           TASK-PID   CPU#  ||||    TIMESTAMP  FUNCTION
#              | |       |   ||||       |         |
          atrace-22948 [000] ...2 623726.157067: sched_switch: prev_comm=atrace prev_pid=22948 prev_prio=120 prev_state=S ==> next_comm=AsyncTask #2 next_pid=21620 next_prio=130

....

我想知道如何更改 current_tracer 以及如何使用 debugfs 进行挂载。

接受并感谢帮助。

谢谢!

【问题讨论】:

你的问题不是很清楚。请改写它。 “出来如下”是实际结果还是预期结果? 对不起。现在英语不够,我考虑下更多。 “像这样出来”说“像这样出来”。 【参考方案1】:

您错过了 /sys/kernel/debug/tracing 下的 available_tracers 选项,它显示了内核中可用的跟踪功能。要查看可用跟踪器的列表,请执行 -

      cat /sys/kernel/debug/tracing/available_tracers

这将显示所有可用的跟踪器。现在,如果你找到了“函数”,那么你就可以跟踪内核函数,否则就不行。

如果您有可用的功能跟踪器选项来激活它,请执行以下操作 -

    echo function > /sys/kernel/debug/tracing/current_tracer
    echo 1 > /sys/kernel/debug/tracing/tracing_on

现在,您将通过 /sys/kernel/debug/tracing/trace 找到跟踪输出。要禁用跟踪,请执行

   echo 0 > /sys/kernel/debug/tracing/tracing_on
   echo nop > /sys/kernel/debug/tracing/current_tracer

因此,更改当前跟踪器的主要要求是,该功能必须可用,可以通过 current_tracer 找到。

【讨论】:

谢谢! cat /sys/kernel/debug/tracing/available_tracers nop @HeavensBus - 那么您需要使用一些具有可用功能跟踪功能的内核。不是这个内核。 有没有办法添加到available_tracers是没有办法重新编译内核的? 没有。您必须重新编译内核。您正在学习的教程包含要启用的功能,请遵循它。 感谢您的帮助。 :)【参考方案2】:

你最好使用 trace-cmd 来做这些事情,然后在控制台中打印这些跟踪要容易得多。

http://www.omappedia.com/wiki/Installing_and_Using_Ftrace#Using_FTrace_with_Trace-cmd

【讨论】:

以上是关于怎么在ftrace中监视自己的函数的主要内容,如果未能解决你的问题,请参考以下文章

用RegNotifyChangeKeyValue函数监视注册表

ftrace:跟踪你的内核函数! | Linux 中国

ftrace利器之trace-cmd和kernelshark

Debugging the kernel using Ftrace

Debugging the kernel using Ftrace

Debugging the kernel using Ftrace