嵌入式与Linux那些事

电子技术应用专栏作家——嵌入式与Linux那些事。关注嵌入式与Linux的校招社招,本人整理了《嵌入式软件工程师笔试面试指南》PDF,平时发布嵌入式与Linux相关的实用技术文章

【调试】ftrace(三)trace-cmd和kernelshark

0
阅读(1540)

之前使用ftrace的时候需要一系列的配置,使用起来有点繁琐,这里推荐一个ftrace的一个前端工具,它就是trace-cmd

trace-cmd安装教程

安装trace-cmd及其依赖库

image.png

image.png

image.png

image.png

image.png

image.png


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。

image.png

只记录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']

image.png

image.png


image.png

image.png


dump

展示 trace-cmd record记录的元数据

image.png

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跟踪并查看输出

image.png

image.png

不追踪某个函数

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。

追踪指定的进程

image.png

event跟踪

查看所有这些事件的列表:

cat /sys/kernel/debug/tracing/available_events

事件跟踪模板

trace-cmd record -e 'subsystem:event-name'

追踪sched子系统的sched_switch事件

image.png

image.png

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

微信图片_20220708145705.jpg

电子技术应用专栏作家 嵌入式与Linux那些事