当前位置: 首页 > news >正文

Linux 调试追踪: trace-cmd 和 kernelshark

文章目录

  • 1. 前言
  • 2. 概述
  • 3. trace-cmd
    • 3.1 下载
    • 3.2 交叉编译
    • 3.3 安装、运行
      • 3.3.1 trace-cmd 示范:抓取系统调度信息
      • 3.3.2 trace-cmd 的更多用法
  • 4. kernelshark
  • 5. 参考资料

1. 前言

限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。

2. 概述

本文演示 ARM64 嵌入式平台下 trace-cmd 和其前端 kernelshark 的使用。trace-cmd 是为便利 ftrace 的使用而设计的 ftrace 前端工具,而 kernelshark 又作为调用 trace-cmd 和可视化 trace-cmd 抓取数据的工具,ftrace、trace-cmd、kernelshark 三者的层次关系如下:

kernelshark (作为 trace-cmd 前端)^
-----|------Vtrace-cmd (作为 ftrace 的前端)^
-----|-----Vftrace

3. trace-cmd

trace-cmd 是为便利 ftrace 的使用而设计的 ftrace 前端工具。

3.1 下载

我们把 libtraceeventlibtracefstrace-cmd 下载到同一目录 $HOME/trace_cmd_tool 下:

$ cd ~
$ mkdir trace_cmd_tool
$ cd trace_cmd_tool$ git clone git://git.kernel.org/pub/scm/libs/libtrace/libtraceevent.git
$ git clone git://git.kernel.org/pub/scm/libs/libtrace/libtracefs.git
$ git clone git://git.kernel.org/pub/scm/utils/trace-cmd/trace-cmd.git$ tree -L 1
.
├── libtraceevent
├── libtracefs
└── trace-cmd

下载完代码后,接下来编译、安装它们,假定将所有编译生成的相关库文件和程序安装到 $HOME/trace_cmd_tool/_install 目录下。

3.2 交叉编译

在编译过程中,假定交叉编译器为 aarch64-none-linux-gnu-gcc,读者请替换为自己使用的交叉编译器;另外,读者也需要将 $HOME 替换为自己的实际 home 目录。注意,要使用绝对路径,不要使用相对路径,否则会出现安装路径错误的问题,因为每个源码包的编译是多层次 Makefie 递归调用过程。

trace-cmd 依赖于 libtracefslibtraceevent,而 libtracefs 的编译依赖于 libtraceevent,所以需要它们的编译顺序如下:

1. libtraceevent
2. libtracefs
3. trace-cmd
  • 编译、安装 libtraceevent
$ cd libtraceevent
$ make CROSS_COMPILE=aarch64-none-linux-gnu-
$ make CROSS_COMPILE=aarch64-none-linux-gnu- DESTDIR=$HOME/trace_cmd_tool/_install install
$ cd -

最后,手工编辑文件 $HOME/trace_cmd_tool/_install/usr/local/lib/x86_64-linux-gnu/pkgconfig/libtraceevent.pc,将内容 prefix=/usr/local 修改为 $HOME/trace_cmd_tool/_install/usr/local

  • 交叉编译、安装 libtracefs
$ cd libtracefs
$ PKG_CONFIG_PATH=$HOME/trace_cmd_tool/_install/usr/local/lib/x86_64-linux-gnu/pkgconfig CC=aarch64-none-linux-gnu-gcc make CROSS_COMPILE=aarch64-none-linux-gnu-
$ PKG_CONFIG_PATH=$HOME/trace_cmd_tool/_install/usr/local/lib/x86_64-linux-gnu/pkgconfig make DESTDIR=$HOME/trace_cmd_tool/_install install
$ cd -

最后,手工编辑文件 $HOME/trace_cmd_tool/_install/usr/local/lib/x86_64-linux-gnu/pkgconfig/libtracefs.pc,将内容 prefix=/usr/local 修改为 $HOME/trace_cmd_tool/_install/usr/local

  • 交叉编译、安装 trace-cmd
$ cd trace-cmd
$ PKG_CONFIG_PATH=$HOME/trace_cmd_tool/_install/usr/local/lib/x86_64-linux-gnu/pkgconfig CC=aarch64-none-linux-gnu-gcc CROSS_COMPILE=aarch64-none-linux-gnu- make
$ PKG_CONFIG_PATH=$HOME/trace_cmd_tool/_install/usr/local/lib/x86_64-linux-gnu/pkgconfig prefix=$HOME/trace_cmd_tool/_install/usr/local etcdir=$HOME/trace_cmd_tool/_install/etc CC=arm-linux-gnueabihf-gcc CROSS_COMPILE=arm-linux-gnueabihf- make install

注意,如果发现文件的安装路径不对,可以手工修改 libtraceevent/Makefilelibtracefs/MakefileLP64 定义,如果是 ARM32 平台,将 LP64 定义为 0,而 ARM64 平台,将 LP64 定义为 1,如下:

# for ARM32
#P64 := 0
# for ARM64
P64 := 1
#LP64 := $(shell echo __LP64__ | ${CC} ${CFLAGS} -E -x c - | tail -n 1)

3.3 安装、运行

2.2 小节将编译生成的 trace-cmd 程序和其依赖的库文件,放到了 $HOME/trace_cmd_tool/_install/usr/local 目录下,其结构层次如下:

$ cd $HOME/trace_cmd_tool/_install/usr/local
$ tree
.
├── bin
│   └── trace-cmd
├── include
│   ├── traceevent
│   │   ├── event-parse.h
│   │   ├── event-utils.h
│   │   ├── kbuffer.h
│   │   └── trace-seq.h
│   └── tracefs
│       └── tracefs.h
└── lib├── libtraceevent.a├── libtraceevent.so -> libtraceevent.so.1├── libtraceevent.so.1 -> libtraceevent.so.1.8.3├── libtraceevent.so.1.8.3├── libtracefs.a├── libtracefs.so -> libtracefs.so.1├── libtracefs.so.1 -> libtracefs.so.1.8.1├── libtracefs.so.1.8.1├── traceevent│   └── plugins│       ├── plugin_cfg80211.so│       ├── plugin_function.so│       ├── plugin_futex.so│       ├── plugin_hrtimer.so│       ├── plugin_jbd2.so│       ├── plugin_kmem.so│       ├── plugin_kvm.so│       ├── plugin_mac80211.so│       ├── plugin_sched_switch.so│       ├── plugin_scsi.so│       ├── plugin_tlb.so│       └── plugin_xen.so└── x86_64-linux-gnu└── pkgconfig├── libtraceevent.pc└── libtracefs.pc

将目录 $HOME/trace_cmd_tool/_install/usr/local 下的所有文件(include 目录可以不用拷贝),拷贝到目标平台的对应目录下,即完成 trace-cmd 的安装。

运行来看一下:

# trace-cmd -htrace-cmd version 3.3.0 (715e628ad9e3e820895115c0d3eb47a75a23c11d)usage:trace-cmd [COMMAND] ...commands:record - record a trace into a trace.dat fileset - set a ftrace configuration parameterstart - start tracing without recording into a fileextract - extract a trace from the kernelstop - stop the kernel from recording trace datarestart - restart the kernel trace data recordingshow - show the contents of the kernel tracing bufferreset - disable all kernel tracing and clear the trace buffersclear - clear the trace buffersreport - read out the trace stored in a trace.dat filestream - Start tracing and read the output directlyprofile - Start profiling and read the output directlyhist - show a histogram of the trace.dat informationstat - show the status of the running tracing (ftrace) systemsplit - parse a trace.dat file into smaller file(s)options - list the plugin options available for trace-cmd reportlisten - listen on a network socket for trace clientsagent - listen on a vsocket for trace clientssetup-guest - create FIFOs for tracing guest VMslist - list the available events, plugins or optionsrestore - restore a crashed recordsnapshot - take snapshot of running tracestack - output, enable or disable kernel stack tracingcheck-events - parse trace event formatsdump - read out the meta data from a trace fileattach - Attach a host and guest trace.dat fileconvert - convert trace file to different versionsqlhist - Run a SQL like query to create histogram or synthetic events (see man tracefs_sql(3))

3.3.1 trace-cmd 示范:抓取系统调度信息

通过命令 trace-cmd record -e 'sched_wakeup*' -e sched_switch -e 'sched_migrate*' 抓取系统调度信息数据,记录到 trace.dat,按 Ctrl + C 停止抓取。

# trace-cmd record -e 'sched_wakeup*' -e sched_switch -e 'sched_migrate*'
Hit Ctrl^C to stop recording
^Clibtracecmd: Interrupted system callNo compression algorithms are supported
CPU0 data recorded at offset=0xd500020480 bytes in size
CPU1 data recorded at offset=0xda0008192 bytes in size
CPU2 data recorded at offset=0xdc00020480 bytes in size
CPU3 data recorded at offset=0xe10004096 bytes in size

3.3.2 trace-cmd 的更多用法

trace-cmd 的更多用法,可参考官方文档 https://trace-cmd.org/Documentation/trace-cmd/ 。

4. kernelshark

kernelshark 作为调用 trace-cmd 和可视化 trace-cmd 抓取数据 trace.dat 的工具。

  • 安装

嵌入式 ARM 嵌入式平台trace-cmd 抓取数据 trace.dat 后,我们不必在嵌入式 ARM 平台安装 kernelshark,因为嵌入式 ARM 平台的资源通常不足以运行 kernelshark,可以转而在 PC 机上安装 kernelshark,然后解析 trace-cmd 抓取的 ARM 嵌入式平台数据 trace.datUbuntu 下可以使用如下命令安装 kernelshark

$ sudo apt-get install kernelshark

注:如果安装的 kernelshark 存在问题,可以通过 git clone git://git.kernel.org/pub/scm/utils/trace-cmd/kernel-shark.git 下载源码进行编译。

  • 使用

通过命令 kernelshark trace.dat 得到可视化视图:

$ kernelshark trace.dat

在这里插入图片描述

图片从左往右是一个时间轴(Time Line),可通过按住鼠标滚轮缩小、放大,也可以通过 +, -, ++, -- 按钮来放大缩小,CPU x 的表示每个 CPU 上发生的调度事件,也可以看成是每个进程占用 CPU 的情况。菜单栏的 Filter 可以过滤 CPU、进程、事件,Plots 用来选择 CPU、进程要显示的事件采样数据图形。Search: 查找功能,可以通过 Column 下拉列表来搜索 Task 查找符合条件的事件数据。更多关于 kernelshark 的使用方法,可参考官方手册 https://kernelshark.org/Documentation.html。

5. 参考资料

[1] 交叉编译trace-cmd
[2] Using KernelShark to analyze the real-time scheduler
[3] https://kernelshark.org/Documentation.html

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 16个好用到爆的Python实用脚本!
  • 如何用密码保护你的 WordPress 管理员 (wp-admin) 目录
  • 互联网之光与人工智能之光交相辉映,如何抓住5G人工智能红利
  • 为什么企业需要进行能源体系认证?
  • 8.3 字符串中等 306 Additive Number 423 Reconstruct Original Digits from English
  • leetcode 贪心专题——java实现
  • Weblogic 漏洞
  • 【Python系列】Poetry使用指南
  • Excel第33享:借助易用宝将多个表格合并到一个表格
  • 【leetcode】相同的树、另一棵树的子树、翻转二叉树(利用深度优先遍历)
  • 用Babylon.js 滑动屏幕画图形,签字等
  • [云原生]三、Kubernetes(1.18)
  • 论文阅读:Most Probable Densest Subgraphs
  • 二手车交易系统开发设计源码及功能解析
  • M21170G-12
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • Apache的80端口被占用以及访问时报错403
  • canvas 五子棋游戏
  • create-react-app做的留言板
  • Joomla 2.x, 3.x useful code cheatsheet
  • k8s 面向应用开发者的基础命令
  • php ci框架整合银盛支付
  • Sass 快速入门教程
  • Spark RDD学习: aggregate函数
  • sublime配置文件
  • Unix命令
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • vue-cli在webpack的配置文件探究
  • WebSocket使用
  • 初识MongoDB分片
  • 后端_ThinkPHP5
  • 线上 python http server profile 实践
  • 项目实战-Api的解决方案
  • 运行时添加log4j2的appender
  • 追踪解析 FutureTask 源码
  • #laravel 通过手动安装依赖PHPExcel#
  • #pragma pack(1)
  • #考研#计算机文化知识1(局域网及网络互联)
  • $.ajax()
  • (3)STL算法之搜索
  • (SERIES12)DM性能优化
  • (笔试题)分解质因式
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (五)activiti-modeler 编辑器初步优化
  • (转)VC++中ondraw在什么时候调用的
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • ***检测工具之RKHunter AIDE
  • *算法训练(leetcode)第四十七天 | 并查集理论基础、107. 寻找存在的路径
  • .mysql secret在哪_MySQL如何使用索引
  • .naturalWidth 和naturalHeight属性,
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .NET Micro Framework初体验(二)
  • .Net 路由处理厉害了
  • @data注解_一枚 架构师 也不会用的Lombok注解,相见恨晚
  • @Value获取值和@ConfigurationProperties获取值用法及比较(springboot)