Heng30的博客
搜索 分类 关于 订阅

如何使用trace-cmd跟踪调试内核?

2025-02-13

trace-cmd是一个用于控制Linux内核跟踪工具ftrace的命令行工具。ftraceLinux内核内置的跟踪框架,能够帮助开发者调试和分析内核行为。trace-cmd简化了ftrace的使用,提供了更友好的接口来配置、启动、停止和查看跟踪数据。

主要功能

  • 记录跟踪数据:通过trace-cmd record命令,可以捕获内核事件、函数调用等跟踪信息。

  • 查看跟踪数据:使用trace-cmd report命令,可以解析和显示记录的跟踪数据。

  • 启动/停止跟踪:通过trace-cmd starttrace-cmd stop命令,可以控制跟踪的开始和结束。

  • 配置跟踪选项:支持设置事件、过滤器、缓冲区大小等参数。

安装

  • sudo apt install trace-cmd

常用命令

record - 将跟踪信息记录到`trace.dat`文件中
set - 设置`ftrace`配置参数
start - 开始跟踪,但不将信息记录到文件中
extract - 从内核中提取跟踪信息
stop - 停止内核记录跟踪数据
restart - 重新启动内核跟踪数据记录
show - 显示内核跟踪缓冲区的内容
reset - 禁用所有内核跟踪并清除跟踪缓冲区
clear - 清除跟踪缓冲区
report - 读取存储在`trace.dat`文件中的跟踪信息
stream - 开始跟踪并直接读取输出
profile - 开始性能分析并直接读取输出
hist - 显示`trace.dat`信息的直方图
stat - 显示正在运行的跟踪(ftrace)系统的状态
split - 将 trace.dat 文件解析为更小的文件
options - 列出可用于`trace-cmd report`的插件选项
listen - 在网络套接字上监听跟踪客户端
agent - 在虚拟套接字上监听跟踪客户端
setup-guest - 为跟踪来宾虚拟机创建 FIFO 文件
list - 列出可用的事件、插件或选项
restore - 恢复崩溃的记录
snapshot - 对正在运行的跟踪进行快照
stack - 输出、启用或禁用内核堆栈跟踪
check-events - 解析跟踪事件格式
dump - 从跟踪文件中读取元数据
attach - 将主机和来宾的`trace.dat`文件关联起来
convert - 将跟踪文件转换为不同的版本

例子

  • 记录跟踪数据: trace-cmd record -e sched_switch

  • 记录指定进程数据: trace-cmd record -P <pid> -e kmem_cache_free

  • 追踪kmem_cache_free函数并输出函数调用图:trace-cmd record -p function_graph -g kmem_cache_free -O funcgraph-proc

  • 查看跟踪数据: trace-cmd report

 gnome-shell-1468  [002] 61057.636462: sched_switch:         gnome-shell:1468 [120] S ==> swapper/2:0 [120]
      <idle>-0     [002] 61057.730187: sched_switch:         swapper/2:0 [120] R ==> kworker/2:2:47656 [120]
 kworker/2:2-47656 [002] 61057.730217: sched_switch:         kworker/2:2:47656 [120] I ==> swapper/2:0 [120]
      <idle>-0     [006] 61057.730364: sched_switch:         swapper/6:0 [120] R ==> kworker/6:3:417 [120]
 kworker/6:3-417   [006] 61057.730429: sched_switch:         kworker/6:3:417 [120] I ==> kcompactd0:79 [120]
      <idle>-0     [004] 61057.730451: sched_switch:         swapper/4:0 [120] R ==> kworker/u21:9:50084 [120]
  kcompactd0-79    [006] 61057.730525: sched_switch:         kcompactd0:79 [120] S ==> swapper/6:0 [120]
  • 更直观的显示trace.dat的数据:trace-cmd hist

  • 启动跟踪:trace-cmd start -e irq_handler_entry

  • 停止跟踪:trace-cmd stop

  • 显示信息:trace-cmd show

# /sys/kernel/debug/tracing/trace

...
<idle>-0       [005] d.h1. 61307.455484: irq_handler_entry: irq=19 name=enp0s3
<idle>-0       [005] d.h1. 61307.474852: irq_handler_entry: irq=19 name=ehci_hcd:usb2
<idle>-0       [005] d.h1. 61307.474897: irq_handler_entry: irq=19 name=enp0s3
<idle>-0       [005] d.h1. 61307.476283: irq_handler_entry: irq=19 name=ehci_hcd:usb2
...

希望上面的内容对你有所帮助。