[置顶] 经过长达六年的研发,Linux Lab 终于迎来了 v1.0 正式版,Linux 内核与嵌入式 Linux 开发从未像今天这般简单。Linux Lab 发布 v1.0 正式版,Linux 内核开发从未像今天这般简单
Ftrace 前端工具 trace cmd 介绍
By 法海 of TinyLab.org Feb 06, 2021
前言
本文为 ftrace 系列文章第三篇,介绍 ftrace 前端工具 trace-cmd 基本用法。
前两篇文章中,我们知道了 ftrace 是什么,以及如何使用。ftrace 最有用的功能是窥探内核函数调用栈及调用关系。
除非是内嵌在应用程序中的 ftrace,其它的各种 ftrace 功能均可以通过 trace-cmd 实现。
本文以实例的形式,展示 trace-cmd 的功能。
function tracer
还以 dev_attr_show
为例,查看其调用栈的 trace-cmd 命令为:
# trace-cmd record -p function -l dev_attr_show --func-stack
提取 trace 结果的命令为:
# trace-cmd report
CPU 1 is empty
CPU 2 is empty
CPU 3 is empty
cpus=4
top-29940 [000] 10255.306256: function: dev_attr_show
top-29940 [000] 10255.306262: kernel_stack: <stack trace>
=> dev_attr_show (ffffffff914fad85)
=> sysfs_kf_seq_show (ffffffff911881b1)
=> kernfs_seq_show (ffffffff911864f7)
=> seq_read (ffffffff91109eca)
=> kernfs_fop_read (ffffffff91186cc1)
=> __vfs_read (ffffffff910df17b)
=> vfs_read (ffffffff910df22e)
=> ksys_read (ffffffff910df3c7)
=> __x64_sys_read (ffffffff910df41a)
=> do_syscall_64 (ffffffff90e04417)
=> entry_SYSCALL_64_after_hwframe (ffffffff91a0008c)
=> 19000a
=> __accumulate_pelt_segments (ffffffff90ef8720)
=> 0
=> 29ccd625bfa
=> 29ccd625cb7
=> 1b4b00000019
=> 19000a
=> __update_load_avg_se (ffffffff90ef8a10)
是不是很像 perf?先通过 record 子命令将结果记录到 trace.dat,再通过 report 命令进行结果提取。
命令解释:
-p
:指定当前的 tracer,类似echo function > current_tracer
,可以是支持的 tracer 中的任意一个-l
:指定跟踪的函数,可以设置多个,类似echo function_name > set_ftrace_filter
--func-stack
:记录被跟踪函数的调用栈
没用到的相似参数:
-n
:指定不跟踪的函数- 比如:
trace-cmd record -p function -l 'dev*' -n dev_attr_show
- 设置跟踪所有 dev 开头的函数,但是不跟踪
dev_attr_show
- 比如:
-g
:指定 function_graph tracer 跟踪的 函数,类似echo function_name > set_graph_function
-O
:设置 options,比如设置options/func_stack_trace
可以用-O func_stack_trace
,在 optoin 名称前加上no
就是将 option 清 0-P
:设置跟踪的进程
注意,function_graph tracer 同时支持 -l/-g
参数,但是两者是有区别的,他们区别的本质还是 set_ftrace_filter
与 set_graph_function
的区别。
-l
表示被跟踪的函数是叶子函数,不会跟踪其内部的调用子函数。-g
表示会跟踪函数内部调用的子函数。如果不好理解,可以挑个函数去试试。
trace event
命令示例:
- 跟踪 sched_switch :
trace-cmd record -e sched:sched_switch
- 跟踪某个 event 的同时记录调用栈:
trace-cmd record -e xxx -T
实例:
- 跟踪 sched_swtich events
# trace-cmd record -e sched_switch
- 查看 sched_switch 消息格式
# cat /sys/kernel/debug/tracing/events/sched/sched_switch/format
- report 结果的时候基于消息格式进行过滤
# trace-cmd report -F "sched_switch: prev_comm == 'kworker/3:0'"
cpus=4
kworker/3:0-29594 [003] 12770.809817: sched_switch: kworker/3:0:29594 [120] W ==> swapper/3:0 [120]
kworker/3:0-29594 [003] 12770.938444: sched_switch: kworker/3:0:29594 [120] W ==> swapper/3:0 [120]
kworker/3:0-29594 [003] 12771.418656: sched_switch: kworker/3:0:29594 [120] W ==> swapper/3:0 [120]
kworker/3:0-29594 [003] 12771.450292: sched_switch: kworker/3:0:29594 [120] W ==> swapper/3:0 [120]
- 抓取过程中过滤使用
-f
,注意,-f
过滤参数中没有 event 名称
# trace-cmd record -e sched_switch -f "prev_comm == 'kworker/3:0'"
猜你喜欢:
- 我要投稿:发表原创技术文章,收获福利、挚友与行业影响力
- 知识星球:独家 Linux 实战经验与技巧,订阅「Linux知识星球」
- 视频频道:泰晓学院,B 站,发布各类 Linux 视频课
- 开源小店:欢迎光临泰晓科技自营店,购物支持泰晓原创
- 技术交流:Linux 用户技术交流微信群,联系微信号:tinylab
支付宝打赏 ¥9.68元 | 微信打赏 | |
![]() | ![]() 请作者喝杯咖啡吧 | ![]() |