【调试】ftrace(三)trace-cmd和kernelshark
0赞之前使用ftrace的时候需要一系列的配置,使用起来有点繁琐,这里推荐一个ftrace的一个前端工具,它就是trace-cmd
trace-cmd安装教程
安装trace-cmd及其依赖库
stop
停止向ring buffer写入跟踪信息。
restart
重新开始记录跟踪信息
show
显示tracing buffer中的信息(trace, snapshot, trace_pipe)。类似于 cat /sys/kernel/debug/tracing/trace
。
trace-cmd show ['OPTIONS']
reset
对ftrace的设置和ring buffer复位。
trace-cmd reset ['OPTIONS']
设置每个cpu的buffer大小为1024
trace-cmd reset -b 1024
删除实例buffer,并重置顶层实例,
trace-cmd reset -t -a -d
clear
清空ring buffer。
trace-cmd clear ['OPTIONS']
清空所有buffer,包括top level
trace-cmd clear -a
清空指定buffer
trace-cmd clear -B buffer-name
report
读取trace的信息,并存储在trace.dat。
只记录kmalloc系统调用中大于1000 bytes 的信息
#trace-cmd report -F 'kmalloc: bytes_req > 1000'
<idle>-0 [000] 158128.126641: kmalloc: call_site=81330635 ptr=0xffff88003c2fd000 bytes_req=2096 bytes_alloc=4096 gfp_flags=GFP_ATOMIC
stream
实时在shell中显式ftrace结果。
trace-cmd stream ['OPTIONS'] ['command']
profile
类似于trace-cmd record - profile
命令,但profile不会将跟踪内容写入文件,可以节省磁盘空间,适用于长时间跟踪。
trace-cmd profile ['OPTIONS'] ['command']
hist
对trace.dat显式统计信息。
trace-cmd hist ['OPTIONS']['input-file']
dump
展示 trace-cmd record
记录的元数据
convert
将trace file
转换为不同格式。
trace-cmd convert ['OPTIONS'] ['output-file']
将trace file
选择合适的压缩算法,压缩为trace_compress.dat
,
trace-cmd convert --compression any trace_compress.dat
更详细的使用方法详见 https://github.com/rostedt/trace-cmd/tree/master/Documentation/trace-cmd
trace-cmd使用举例
function && function_graph跟踪
列出可用的追踪器
root@firefly:~# trace-cmd list -t
blk function_graph wakeup_dl wakeup_rt wakeup irqsoff function nop
查看可被追踪的函数
root@firefly:~# trace-cmd list -f | grep do_sys_open
do_sys_open
调整函数调用中追踪深度:
root@firefly:~# trace-cmd start -p function_graph --max-graph-depth 5
启用function跟踪并查看输出
不追踪某个函数
root@firefly:~# trace-cmd start -p function -n do_sys_open
追踪特定PID
trace-cmd record -P 10885 -p function_graph
trace-cmd start
和trace-cmd record
参数类似,trace-cmd record
会记录追踪内容到trace.dat。
追踪指定的进程
event跟踪
查看所有这些事件的列表:
cat /sys/kernel/debug/tracing/available_events
事件跟踪模板
trace-cmd record -e 'subsystem:event-name'
追踪sched
子系统的sched_switch
事件
kernelshark的使用
kernelshark记录事件
通过在命令行输出kernelshark
可以启动kernelshark。通过菜单栏执行Tools->Record,会弹出Capture对话框。
常用的设置有Events和Plugin,比如这里设置了sched_switch和sched_wakeup两个事件,选择了function_graph插件。
然后点击apply应用配置,capture开始捕获。ctrl+c可以停止捕获。
Close关闭后,可以在Kenelshark中查看细节。
可以看出这里不光显示了sched_switch和sched_wakeup事件,同时还显示了function_graph函数调用。
数据过滤
通常获取的数据需要进行一些过滤,才能发现问题。
filter提供了丰富的过滤功能,比如过滤事件,CPU,Tasks等。
也可以使用高级过滤功能,可以
如果想清除所有过滤信息,点击clear all filters 即可。
图表过滤
Plots提供了CPU和Tasks的过滤,如下所示,我们选择只展示CPU0的nautilus进程。
最后筛选结果
其它功能
还有一些其它有用的功能,比如搜索功能,选定要搜索的Column,文本框中输入字符串即可。
如下,我们筛选出PDI为3038的进程,总共找到44831个,当前是第1937个。
原文链接:https://mp.weixin.qq.com/s/Za80_LeySQgUpATPc20x6A
电子技术应用专栏作家 嵌入式与Linux那些事