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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具