リネオブログ

Linux システムを見える化する kernelshark の使い方 第 2 回

2022 年 11 月 29 日   Linux 技術ネタ

目次

  1. はじめに
  2. 4. kernelsharkで表示するトレースログを取得する
  3. 参考文献

はじめに

組込み Linux 開発において、以下のケースに直面することはよくあるのではないでしょうか ?

  • 優先度が高いアプリケーションが意図通り動作しているか確認したい
  • 定周期のリアルタイムプロセスが期待する周期内に実行完了しないことがあるが何が悪いのかわからない
  • 優先度逆転が発生するが原因がわからない
  • 開発したドライバの挙動がおかしい。関数経路を調査したい。

このような解析をサポートするために、Linux カーネルには ftrace というトレーサーが搭載されています。様々な情報を取り出せる反面、コマンドラインでの制御が必要なため、使用性が低く、結果ファイルがテキストであるため、可読性が悪いです。この欠点を補うために、OSS ツールとして、ftrace のユーザーインターフェース trace-cmd と結果ファイルをビジュアル表示する kernelshark が用意されています。

このブログエントリでは、組込み Linux からトレースログを取得し、kernelshark で表示する一連の流れと kernelshark の機能概要を紹介します。

本ブログは全 3 部構成となります。
第 2 回目は、kernelshark で表示するトレースログを取得する手法について解説します。

前回:Linux システムを見える化する kernelshark の使い方 第 1 回

4. kernelsharkで表示するトレースログを取得する

4.1 構成

kernelshark でトレースログを表示するまでの構成を以下に示します。開発環境と解析環境は、別々でも同一でも構いません。また、実行環境のボードは、例として Raspberry Pi 3 model B(以降、RPi 3B) としています。各環境に読み替えてください。

kernelshark でトレースログを表示するまでの構成

kernelshark でトレースログを表示するまでの構成

4.2 Step.1 ターゲット環境構築

4.2.1 ターゲットマシン

トレースログを取得する Linux が動作するハードウェアです。
ここでは、Yocto で Linux イメージをビルド可能、かつ、入手しやすい Arm マシンとして、RPi 3B を使います。

4.2.2 Yoctoビルド環境

ターゲットマシンで動作する Linux をビルドする開発環境です。ここでは、Yocto を想定しますが、別の開発環境をご使用の場合は、読み替えてください。
構築ホストには Ubuntu 20.04.4 (Virtualbox) を使用します。Yocto バージョンは執筆時点(2022/09/01)での最新 LTS の Kirkstone 4.0.3 を使用します。

必要なレイヤーは次の通りです。

  • Poky (oe-core)
  • meta-oe
  • meta-raspberrypi
4.2.3 Linuxのビルド手順

● Yocto 構築に必要なパッケージを取得します。(下記リンク参照)

1.2.1 Ubuntu and Debian

$ sudo apt install gawk wget git diffstat unzip texinfo gcc build-essential \
  chrpath socat cpio python3 python3-pip python3-pexpect xz-utils debianutils \
  iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev pylint3 \
  xterm python3-subunit mesa-common-dev zstd liblz4-tool

● 構築に使用するレイヤーを取得します。

$ mkdir work
$ cd work

$ git clone git://git.yoctoproject.org/poky -b kirkstone
$ git clone git://git.openembedded.org/meta-openembedded -b kirkstone
$ git clone git://git.yoctoproject.org/meta-raspberrypi -b kirkstone

● 構築環境をセットアップします。

$ cd poky
$ . ./oe-init-build-env

$ bitbake-layers add-layer ../../meta-openembedded/meta-oe/
$ bitbake-layers add-layer ../../meta-raspberrypi/

● ビルド構成を変更します。

$ vi conf/local.conf

次の内容を追加してください。

MACHINE = "raspberrypi3-64"

IMAGE_INSTALL:append = " trace-cmd"

● カーネルコンフィグを変更します。

ftraceを使用するために、適切なカーネルコンフィグを有効にする必要があります。

$ bitbake linux-raspberrypi -c menuconfig

Kernel hacking ---> Tracers ---> 以下に ftrace 関連のコンフィグがまとめられています。以下設定の有効化を推奨します(linux-raspberrypi 5.15.34 の場合)。

ftrace 関連のコンフィグ

ftrace 関連のコンフィグ

● RPi 3B 用の起動イメージを構築します。

$ bitbake core-image-minimal

● 完成したイメージを SD カードに書き込み、RPi 3B を起動します。

$ cd tmp/deploy/images/raspberrypi3-64
$ bzip2 -d core-image-minimal-raspberrypi3-64-yyyymmddhhmmss.rootfs.wic.bz2
$ sudo dd if=core-image-minimal-raspberrypi3-64-yyyymmddhhmmss.rootfs.wic of=/dev/sdX # 実際のデバイス名にあわせること
Poky (Yocto Project Reference Distro) 4.0.3 raspberrypi3-64 /dev/ttyAMA0

raspberrypi3-64 login:
root@raspberrypi3-64:~# trace-cmd

trace-cmd version 2.9.1 (530b1a0caef39466e16bbd49de5afef89656f03f+)

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

4.3 Step.2 トレースログの取得

trace-cmd を使用します。詳細は 5 章(第 3 回)を参照ください。

ftrace を操作するためのインターフェースは下記の通り debugfs 上に存在します。これらを 1つずつ操作することは大変面倒で、ミスも起こりやすくなります。trace-cmd は、ftrace をより簡単に使用するために作成されたユーザーフレンドリーなコマンドです。

root@raspberrypi3-64:~# ls -l /sys/kernel/debug/tracing/
-r--r-----    1 root     root             0 Jan  1  1970 README
-r--r-----    1 root     root             0 Jan  1  1970 available_events
-r--r-----    1 root     root             0 Jan  1  1970 available_filter_functions
-r--r-----    1 root     root             0 Jan  1  1970 available_tracers
-r--r-----    1 root     root             0 Jan  1  1970 buffer_percent
-rw-r-----    1 root     root             0 Jan  1  1970 buffer_size_kb
-r--r-----    1 root     root             0 Jan  1  1970 buffer_total_size_kb
-rw-r-----    1 root     root             0 Jan  1  1970 current_tracer
-r--r-----    1 root     root             0 Jan  1  1970 dyn_ftrace_total_info
-rw-r-----    1 root     root             0 Jan  1  1970 dynamic_events
-r--r-----    1 root     root             0 Jan  1  1970 enabled_functions
-rw-r-----    1 root     root             0 Jan  1  1970 error_log
drwxr-x---   88 root     root             0 Jan  1  1970 events
--w-------    1 root     root             0 Jan  1  1970 free_buffer
-rw-r-----    1 root     root             0 Jan  1  1970 function_profile_enabled
drwxr-x---    2 root     root             0 Jan  1  1970 instances
-rw-r-----    1 root     root             0 Jan  1  1970 kprobe_events
-r--r-----    1 root     root             0 Jan  1  1970 kprobe_profile
-rw-r-----    1 root     root             0 Jan  1  1970 max_graph_depth
drwxr-x---    2 root     root             0 Jan  1  1970 options
drwxr-x---    6 root     root             0 Jan  1  1970 per_cpu
-r--r-----    1 root     root             0 Jan  1  1970 printk_formats
-r--r-----    1 root     root             0 Jan  1  1970 saved_cmdlines
-rw-r-----    1 root     root             0 Jan  1  1970 saved_cmdlines_size
-r--r-----    1 root     root             0 Jan  1  1970 saved_tgids
-rw-r-----    1 root     root             0 Jan  1  1970 set_event
-rw-r-----    1 root     root             0 Jan  1  1970 set_event_notrace_pid
-rw-r-----    1 root     root             0 Jan  1  1970 set_event_pid
-rw-r-----    1 root     root             0 Jan  1  1970 set_ftrace_filter
-rw-r-----    1 root     root             0 Jan  1  1970 set_ftrace_notrace
-rw-r-----    1 root     root             0 Jan  1  1970 set_ftrace_notrace_pid
-rw-r-----    1 root     root             0 Jan  1  1970 set_ftrace_pid
-rw-r-----    1 root     root             0 Jan  1  1970 set_graph_function
-rw-r-----    1 root     root             0 Jan  1  1970 set_graph_notrace
-rw-r-----    1 root     root             0 Jan  1  1970 snapshot
-rw-r-----    1 root     root             0 Jan  1  1970 stack_max_size
-r--r-----    1 root     root             0 Jan  1  1970 stack_trace
-rw-r-----    1 root     root             0 Jan  1  1970 stack_trace_filter
-r--r-----    1 root     root             0 Jan  1  1970 timestamp_mode
-rw-r-----    1 root     root             0 Jan  1  1970 trace
-rw-r-----    1 root     root             0 Jan  1  1970 trace_clock
--w--w----    1 root     root             0 Jan  1  1970 trace_marker
--w--w----    1 root     root             0 Jan  1  1970 trace_marker_raw
-rw-r-----    1 root     root             0 Jan  1  1970 trace_options
-r--r-----    1 root     root             0 Jan  1  1970 trace_pipe
drwxr-x---    2 root     root             0 Jan  1  1970 trace_stat
-rw-r-----    1 root     root             0 Jan  1  1970 tracing_cpumask
-rw-r-----    1 root     root             0 Jan  1  1970 tracing_max_latency
-rw-r-----    1 root     root             0 Jan  1  1970 tracing_on
-rw-r-----    1 root     root             0 Jan  1  1970 tracing_thresh

4.4 Step.3 取得したトレースログを kernelshark で表示

4.4.1 ホスト環境

取得したトレースログを kernelshark で表示する解析環境です。開発環境と同一で構いません。
ここでは、開発環境と同一の Ubuntu 20.04.4(Virtualbox)を使用します。

4.4.2 kernelshark のインストール手順

kernelshark をインストールします。

$ sudo apt install kernelshark

kernelshark をインストールする際に、trace-cmd も一緒にインストールされます。

4.4.3 kernelshark の起動とトレースログの表示手順

kernelshark を起動します。

$ kernelshark

または、

$ kernelshark <トレースログのパス>

トレースログを引数に指定して実行することで、そのファイルを開くことができます。引数なしで起動し、メニュー File -> Open よりトレースログを開くことも可能です。引数なしで起動した場合、trace.dat が存在すれば、それを開きます。

参考文献

Yocto Project 公式実践講座 5 月 ~ 7 月 開催分 受講お申込み受付中!
Vigiles サポート
Yocto Project よもやま話
Yocto よもやま話 第 14 回 「Yocto 4.3 Nanbield リリース」
Yocto よもやま話 第 14 回 「Yocto 4.3 Nanbield リリース」

2024 年 03 月 26 日 Yocto Project よもやま話

Yocto よもやま話 第 13 回 「Yocto Project の最新動向 2023 夏」
Yocto よもやま話 第 13 回 「Yocto Project の最新動向 2023 夏」

2023 年 07 月 25 日 Yocto Project よもやま話

Yocto よもやま話 第 12 回 「Yocto Project 始めます その 2」
Yocto よもやま話 第 12 回 「Yocto Project 始めます その 2」

2023 年 06 月 20 日 Yocto Project よもやま話

Linux 技術ネタ
RISC-Vについて学ぶ-後編
RISC-Vについて学ぶ-後編

2024 年 01 月 10 日 Linux 技術ネタ

RISC-Vについて学ぶ-前編
RISC-Vについて学ぶ-前編

2023 年 12 月 12 日 Linux 技術ネタ

イベントレポート
EdgeTech+ 2023 出展レポート
EdgeTech+ 2023 出展レポート

2023 年 12 月 14 日 イベントレポート

EdgeTech+ West 2023 出展レポート
EdgeTech+ West 2023 出展レポート

2023 年 08 月 09 日 イベントレポート

Design Solution Forum 2022
Design Solution Forum 2022

2023 年 02 月 27 日 イベントレポート

リクルート
新卒採用、絶賛募集中!
新卒採用、絶賛募集中!

2023 年 05 月 30 日 リクルート

国立大学オンライン研修レポート 2022
国立大学オンライン研修レポート 2022

2022 年 09 月 27 日 リクルート

北小野通信
北小野通信 桜の季節、珍客来訪?
北小野通信 桜の季節、珍客来訪?

2023 年 05 月 11 日 北小野通信

北小野通信 「 日本土真ん中ウォーク 2022 」
北小野通信 「 日本土真ん中ウォーク 2022 」

2023 年 01 月 30 日 北小野通信

北小野通信 1011
北小野通信 1011

2022 年 10 月 11 日 北小野通信

ソリューション統括部
シリコンバレー探検記 2019 ~番外編~
シリコンバレー探検記 2019 ~番外編~

2019 年 12 月 10 日 ソリューション統括部

シリコンバレー探検記 2019 ~後編~
シリコンバレー探検記 2019 ~後編~

2019 年 12 月 10 日 ソリューション統括部

シリコンバレー探検記 2019 ~前編~
シリコンバレー探検記 2019 ~前編~

2019 年 12 月 10 日 ソリューション統括部

マーケティング統括部
大成功決起大会!!(ET2019)
大成功決起大会!!(ET2019)

2019 年 12 月 13 日 マーケティング統括部

ESEC 2019 決起大会
ESEC 2019 決起大会

2019 年 04 月 25 日 マーケティング統括部

シリコンバレー探検記 その 2
シリコンバレー探検記 その 2

2018 年 12 月 18 日 マーケティング統括部