ftrace使用介绍

Ftrace提供了linux下对内核事情的追踪能力,可以理解为内核太的strace。

Ftrace使能

ftrace的位置一般位于/sys/kernel/debug/tracing/或者/sys/kernel/tracing.

Ftrace依赖内核开关使能:

  • CONFIG_FUNCTION_TRACER
  • CONFIG_FUNCTION_GRAPH_TRACER
  • CONFIG_STACK_TRACER
  • CONFIG_DYNAMIC_FTRACE

 ftrace是依赖于debugfs,也就是说它的使用与tracing/下各个文件关联。

current_tracer:配置和显示当前使能tracer。可用tracer见available_tracers;
available_tracers:显示系统支持的tracer。
tracing_on:使能写trace日志到ring buffer的开关,同时也可cat查看是否使能。echo 0表示关闭,echo 1表示打开。注意这里是总开关的概念,如果current_tracer或event都未使能(配置为空和关闭event开关),那么就算这里写1使能,trace文件也是空的;如果配置了current_tracer和event,这个接口相当于总开关。
trace:保存trace记录,cat trace查看跟踪记录。注意这里是临时存放buffer,有空间大小限制,如果超了会被覆盖。
buffer_size_kb:用于设置和显示单个CPU所使用的跟踪缓存的大小。跟踪缓存为RingBuffer形式,如果跟踪太多,旧的信息会被新的跟踪信息覆盖掉。默认size通常是一个页(4K)。每个cpu的buffer size配置在per_cpu/cpu0/buffer_size_kb,percpu配置后,此文件显示"X"。
buffer_total_size_kb:显示所有的跟踪缓存大小,不同之处在于buffer_size_kb是单个CPU的,buffer_total_size_kb是所有CPU的和。
trace_pipe:输出和trace一样的内容,输出实时tracing日志,这样就避免了RingBuffer的溢出。cat trace_pipe > trace.txt &保存文件,但是cat时候会带来一些性能损耗。
trace_options:控制Trace打印内容格式或者设置跟踪器,可以通过trace_options添加很多附加信息。
options:目录文件,里面是每个trace options的文件,和trace_options对应,可以通过echo 0/1使能options。
tracing_max_latency:记录某些Tracer的最大延时。比如interrupts的最大延时关闭后,会记录在这里。可以echo值到此文件,然后遇到比设置值更大的延迟才会更新。
tracing_thresh:延时记录Trace的阈值,当延时超过此值时才开始记录Trace。单位是ms,只有非0才起作用
free_buffer:此文件用于在一个进程被关闭后,同时释放RingBuffer内存,并将调整大小到最小值。
tracing_cpumask:可以通过此文件设置跟踪指定CPU,二进制格式。
set_ftrace_filter:指定要跟踪的函数,可跟踪函数见available_filter_functions
set_ftrace_notrace:指定不跟踪的函数,缺省为空。
set_ftrace_pid:tracer将只追踪写入此文件PID的对应的进程。"function-fork" option设置后,pid对应进程创建的子进程也会自动跟踪。
set_event_pid:tracer将只追踪写入此文件PID的对应进程的event。"event-fork" option设置后,pid对应进程创建的子进程event也会自动跟踪。
set_graph_function:function_graph tracer将只跟踪此文件配置的函数,缺省对所有函数都追踪。
set_graph_notrace:function_graph tracer不跟踪特定的函数嵌套调用。
available_filter_functions:显示可以跟踪的functions。
dyn_ftrace_total_info:debug使用,显示available_filter_functins中跟中函数的数目,两者一致
enabled_functions:显示回调函数。
function_profile_enabled:使能trace_stat/function<cpu> 的统计信息功能,统计包括function/hit/Time/Avg等信息。
trace_stat:存放不同tracing状态的目录
kprobe_events:Enable dynamic trace points. See kprobetrace.txt.
kprobe_profile:Dynamic trace points stats. See kprobetrace.txt.
max_graph_depth:function graph tracer使用,配置函数嵌套的最大深度。
printk_formats:提供给工具读取原始格式trace的文件。
saved_cmdlines:ftrace会存放pid的comms在一个pid mappings,在显示event时候同时显示comm,这里可以配置pid对应的comm,如果配置,显示类似<idle>-0,否则<...>-0。
saved_cmdlines_size:saved_cmdlines的数目
saved_tgids:If the option "record-tgid" is set, on each scheduling context switch the Task Group ID of a task is saved in a table mapping the PID of the thread to its TGID. By default, the "record-tgid" option is disabled.
snapshot:是对trace的snapshot。
                              echo 0清空缓存,并释放对应内存。
                              echo 1进行对当前trace进行snapshot,如没有内存则分配。
                              echo 2清空缓存,不释放也不分配内存。
stack_max_size:当使用stack跟踪器时,记录产生过的最大stack size
stack_trace:显示stack的back trace
stack_trace_filter:设置stack tracer不检查的函数名称

trace_clock:配置trace日志中"timestamp"列的时钟,默认使用local时钟。
	local:默认时钟,在每CPU中快速且精准,但是可能不会在各个CPU之间同步;
	global:各CPU间同步,但是比local慢;
	counter:并不是时钟,而是一个原子计数器。数值一直+1,但是所有cpu是同步的。主要用处是分析不同cpu发生的events;
	uptime:time stamp和jiffies counter根据boot time;
	perf:clock跟perf使用一致。
	x86-tsc:非系统自己时钟。比如x86有TSC cycle clock;
	ppc-tb:使用powerpc的基础时钟寄存器值;
	mono:使用fast monotonic clock (CLOCK_MONOTONIC)
	mono_raw:使用raw monotonic clock (CLOCK_MONOTONIC_RAW)
	boot:使用boot clock (CLOCK_BOOTTIME)。

trace_marker:从用户态写trace mark到ftrace中,可以做一个标记到trace。
trace_marker_raw:以二进制格式写入到trace中。
uprobe_events:Add dynamic tracepoints in programs.See uprobetracer.rst
uprobe_profile:Uprobe statistics. See uprobetrace.txt
instances:创建不同的trace buffer实例,可以在不同的trace buffers中分开记录。
events:系统Trace events目录,在每个events下面都有enable、filter和fotmat。enable是开关;format是events的格式,然后根据格式设置 filter。
set_event:将Trace events名称直接写入set_event就可以打开。
available_events:列出系统中所有可用的Trace events,分两个层级,用冒号隔开。
per_cpu:
per_cpu/cpu0/buffer_size_kb:配置per_cpu的buffer空间
per_cpu/cpu0/trace:当前CPU的trace文件。
per_cpu/cpu0/trace_pipe:当前CPU的trace_pipe文件。
per_cpu/cpu0/trace_pipe_raw:当前CPU的trace_pipe_raw
per_cpu/cpu0/snapshot:当前CPU的snapshot
per_cpu/cpu0/snapshot_raw:当前CPU的snapshot_raw
per_cpu/cpu0/stats:当前CPU的trace统计信息
每个文件的详细使用可以参考kernel Document/trace/ftrace.rst

Ftrace使用范例
adb shell "echo 65536 > /sys/kernel/tracing/buffer_size_kb"
adb shell "echo nop > /sys/kernel/tracing/current_tracer"
adb shell "echo 'sched_switch sched_wakeup sched_wakeip_new block_rq_issue block_rq_complete irq_handler_entry
irq_handler_exit mmc_blk_rw_start mmc_blk_rw_end' > /sys/kernel/tracing/set_event"

adb shell "echo > /sys/kernel/tracing/trac" //清空buffer
adb shell "echo 1 > /sys/kernel/tracing/tracing_on" //enable ftrace
/do test/
adb shell "echo 0 > /sys/kernel/tracing/tracing_on"
adb pull /sys/kenrel/tracing/trace SYS-Ftrace

ftrace参考网站:https://tinylab.org/ftrace-usage/
https://www.zhihu.com/column/c_1136667431828316160
posted @   老胡同学  阅读(1467)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示