Linux 调试追踪: trace-cmd 和 kernelshark

news2024/11/17 3:23:08

文章目录

  • 1. 前言
  • 2. 概述
  • 3. trace-cmd
    • 3.1 下载
    • 3.2 交叉编译
    • 3.3 安装、运行
      • 3.3.1 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 前端)
     ^
-----|------
     |
     V
 trace-cmd (作为 ftrace 的前端)
     ^
-----|-----
     V
  ftrace

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 -h

trace-cmd version 3.3.0 (715e628ad9e3e820895115c0d3eb47a75a23c11d)

usage:
  trace-cmd [COMMAND] ...

  commands:
     record - record a trace into a trace.dat file
     set - set a ftrace configuration parameter
     start - start tracing without recording into a file
     extract - extract a trace from the kernel
     stop - stop the kernel from recording trace data
     restart - restart the kernel trace data recording
     show - show the contents of the kernel tracing buffer
     reset - disable all kernel tracing and clear the trace buffers
     clear - clear the trace buffers
     report - read out the trace stored in a trace.dat file
     stream - Start tracing and read the output directly
     profile - Start profiling and read the output directly
     hist - show a histogram of the trace.dat information
     stat - show the status of the running tracing (ftrace) system
     split - parse a trace.dat file into smaller file(s)
     options - list the plugin options available for trace-cmd report
     listen - listen on a network socket for trace clients
     agent - listen on a vsocket for trace clients
     setup-guest - create FIFOs for tracing guest VMs
     list - list the available events, plugins or options
     restore - restore a crashed record
     snapshot - take snapshot of running trace
     stack - output, enable or disable kernel stack tracing
     check-events - parse trace event formats
     dump - read out the meta data from a trace file
     attach - Attach a host and guest trace.dat file
     convert - convert trace file to different version
     sqlhist - 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 call
  No compression algorithms are supported
CPU0 data recorded at offset=0xd5000
    20480 bytes in size
CPU1 data recorded at offset=0xda000
    8192 bytes in size
CPU2 data recorded at offset=0xdc000
    20480 bytes in size
CPU3 data recorded at offset=0xe1000
    4096 bytes in size

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
version = 6

在这里插入图片描述

图片从左往右是一个时间轴(Time Line),可通过按住鼠标左右拖动来缩小、放大CPU x 的表示每个 CPU 上发生的调度事件,也可以看成是每个进程占用 CPU 的情况。还可以通过 Column 下拉列表来选择 Task 选择关心进程在不同 CPU 上的执行耗时情况。

笔者手头没有现成的 ARM 嵌入式平台抓取数据,使用的 Ubuntu PC 的抓取数据来进行演示。

5. 参考资料

[1] 交叉编译trace-cmd
[2] Using KernelShark to analyze the real-time scheduler

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1975268.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java多线程-----定时器(Timer)及其实现

目录 一.定时器简介: 二.定时器的构造方法与常见方法: 三.定时器的模拟实现: 思路分析: 代码实现: 在开发中,我们经常需要一些周期性的操作,例如每隔几分钟就进行某一项操作,这…

【QT】常用控件-上

欢迎来到Cefler的博客😁 🕌博客主页:折纸花满衣 目录 👉🏻QWidgetenabledgeometryrect制作上下左右按钮 window frame 的影响window titlewindowIcon代码示例: 通过 qrc 管理图片作为图标 windowOpacitycursor使用qrc自…

Python | Leetcode Python题解之第309题买卖股票的最佳时机含冷冻期

题目: 题解: class Solution:def maxProfit(self, prices: List[int]) -> int:if not prices:return 0n len(prices)f0, f1, f2 -prices[0], 0, 0for i in range(1, n):newf0 max(f0, f2 - prices[i])newf1 f0 prices[i]newf2 max(f1, f2)f0, …

【笔记】《冲击弹性波理论与应用》[2-2] 振动信号分析

1.前级硬件滤波 - 降噪 2.软件降噪 2.1 移动平滑滤波 2.1.1 移动平滑滤波的效果 2.2 经验模态分解法 2.1.1 效果 3 信号分析 除了FFT,最大熵和小波变换现在也很流行。 3.1 最大熵 3.1.1 与FFT的比对 3.2 相关性分析 3.2.1 自相关 3.2.2 互相关 3.3. 小波 非等周期信号 3…

《python语言程序设计》2018第6章第28题 掷骰子 两个色子,分别是1到6

2、3、12 玩家输 7、11玩家赢 4、5、6、8、9、10算1点&#xff0c;之后出7玩家输或者和上一次相同。def rolled(num_t):count 0still_win 0second_win 0still_lose 0second_lose 0while count < num_t:a_1 random.randint(1, 6)b_1 random.randint(1, 6)tTen a_1 b…

力扣-41.缺失的第一个正数

刷力扣热题–第二十五天:41.缺失的第一个正数 新手第二十五天 奋战敲代码&#xff0c;持之以恒&#xff0c;见证成长 1.题目简介 2.题目解答 做这道题有点投机取巧的感觉&#xff0c;要求时间复杂度O(N),且空间复杂度O(1)&#xff0c;那么就是尽可能的去找到更多的可能性&…

C语言程序设计之数组1

程序设计之数组1 问题1_1代码1_1结果1_1 问题1_2代码1_2结果1_2 问题1_3代码1_3结果1_3 问题1_4代码1_4结果1_4 问题1_5代码1_5结果1_5 问题1_1 函数 f u n fun fun 的功能是&#xff1a;移动一位数组中的内容&#xff0c;若数组中有 n n n 个整数&#xff0c;要求把下标从 …

软件测试生命周期、BUG描述与处理策略

软件测试的生命周期 需求分析&#xff1a;需求是否完整、是否正确 测试计划&#xff1a;确定由谁测试、测试的起止时间、设计哪些模块 测试设计、测试开发&#xff1a;写测试用例&#xff08;手工、自动化测试用例&#xff09;、编写测试工具 执行测试用例 测试评估&…

衢州骨伤科医院为98岁高龄老人做髋关节置换,患者第三天便下地行走

灵活迈步、周身整洁、双手提着两口袋鸡蛋......在清晨的菜市场里&#xff0c;王阿婆&#xff08;化名&#xff09;在人群里穿梭&#xff0c;买一些自己和女儿想吃的菜。如果没有看到她的脸&#xff0c;大家都以为她只有 60 多岁&#xff1b;再定睛一看&#xff0c;她虽然脸上布…

Token的原理及区别,以及与Cookie,Session之间的区别?

Token&#xff0c;特别是JSON Web Token&#xff08;JWT&#xff09;&#xff0c;也是一种用于管理用户状态和身份的机制&#xff0c;但它与Cookie和Session的工作方式有所不同。下面将详细解释Token如何管理用户状态和身份。 Token的工作原理 Token是一种无状态的认证机制&am…

QQ邮箱 + Kafka + Redis + Thymeleaf 模板引擎实现简单的用户注册认证

1. 前提条件 1.1 Redis 1.1.1 拉取 Redis 镜像 docker pull redis:latest 1.1.2 启动 Redis 容器 docker run --name my-redis -d -p 6379:6379 redis:latest1.2 Kafka 1.2.1 docker-compose.yml version: 3.8 services:zookeeper:image: "zookeeper:latest"h…

【C++入门(上)】—— 我与C++的不解之缘(一)

前言&#xff1a; 学完C语言和初阶数据结构&#xff0c;感觉自己又行了&#xff1f; 接下来进入C的学习&#xff0c;准备好接受头脑风暴吧。 一、第一个C程序 C 的第一个程序&#xff0c;梦回出学C语言&#xff0c;第一次使用C语言写代码&#xff1b;这里使用C写第一个C代码。 …

微信文件如何直接打印及打印功能在哪里设置?

在数字化时代&#xff0c;打印需求依旧不可或缺&#xff0c;但传统打印店的高昂价格和不便操作常常让人头疼。幸运的是&#xff0c;琢贝打印作为一款集便捷、经济、高效于一体的网上打印平台&#xff0c;正逐渐成为众多用户的首选。特别是通过微信小程序下单&#xff0c;更是让…

html+css前端作业和平精英2个页面(无js)

htmlcss前端作业和平精英2个页面&#xff08;无js&#xff09;有视频播放器等功能效果 下载地址 https://download.csdn.net/download/qq_42431718/89608232 目录1 目录2 项目视频 和平精英2个页面&#xff08;无js&#xff09;带视频播放 页面1 页面2

MinIO:高性能轻量云存储轻松搭建与springboot应用整合实践

简介 Minio是一款用Golang编写的开源对象存储套件&#xff0c;遵循Apache License v2.0开源协议。它虽然体积小巧&#xff0c;但性能出色。Minio支持亚马逊S3云存储服务接口&#xff0c;可以方便地与其他应用如NodeJS、Redis、MySQL等集成使用。 纠删码技术 Minio纠删码是一…

SpringBoot项目以及相关数据库部署在Linux常用命令

SpringBoot项目部署 1.IDEA打包&#xff0c;在IDEA终端&#xff0c;输入mvn clean install mvn clean package&#xff1a;删除目标文件夹、编译代码并打包mvn clean install&#xff1a;删除目标文件夹、编译代码并打包、将打好的包放置到本地仓库中 2.将项目target中的jar包…

LeetCode 面试经典 150 题 | 位运算

目录 1 什么是位运算&#xff1f;2 67. 二进制求和3 136. 只出现一次的数字4 137. 只出现一次的数字 II5 201. 数字范围按位与 1 什么是位运算&#xff1f; ✒️ 源自&#xff1a;位运算 - 菜鸟教程 在现代计算机中&#xff0c;所有数据都以二进制形式存储&#xff0c;…

【多模态大模型】 BLIP-2 in ICML 2023

一、引言 论文&#xff1a; BLIP-2: Bootstrapping Language-Image Pre-training with Frozen Image Encoders and Large Language Models 作者&#xff1a; Salesforce Research 代码&#xff1a; BLIP-2 特点&#xff1a; 该方法分别使用冻结的图像编码器&#xff08;ViT-L/…

力扣SQL50 部门工资前三高的所有员工 自连接 子查询

Problem: 185. 部门工资前三高的所有员工 &#x1f468;‍&#x1f3eb; 参考题解 SELECTd.Name AS Department, -- 选择部门的名称&#xff0c;并将其别名为 Departmente1.Name AS Employee, -- 选择员工的姓名&#xff0c;并将其别名为 Employeee1.…

cmake之find_package命令详解

前言 find_package是cmake用来管理第三方库的一个命令。那这个命令有什么用呢&#xff1f;在实际项目开发中&#xff0c;我们肯定会使用到第三方库。那就需要在程序中&#xff0c;去指定库的位置和头文件位置&#xff0c;但库的安装位置&#xff0c;每个人都是不一样的&#x…