2022 年 11 月 29 日 Linux 技術ネタ
組込み Linux 開発において、以下のケースに直面することはよくあるのではないでしょうか ?
このような解析をサポートするために、Linux カーネルには ftrace というトレーサーが搭載されています。様々な情報を取り出せる反面、コマンドラインでの制御が必要なため、使用性が低く、結果ファイルがテキストであるため、可読性が悪いです。この欠点を補うために、OSS ツールとして、ftrace のユーザーインターフェース trace-cmd と結果ファイルをビジュアル表示する kernelshark が用意されています。
このブログエントリでは、組込み Linux からトレースログを取得し、kernelshark で表示する一連の流れと kernelshark の機能概要を紹介します。
本ブログは全 3 部構成となります。
第 2 回目は、kernelshark で表示するトレースログを取得する手法について解説します。
前回:Linux システムを見える化する kernelshark の使い方 第 1 回
kernelshark でトレースログを表示するまでの構成を以下に示します。開発環境と解析環境は、別々でも同一でも構いません。また、実行環境のボードは、例として Raspberry Pi 3 model B(以降、RPi 3B) としています。各環境に読み替えてください。
kernelshark でトレースログを表示するまでの構成
トレースログを取得する Linux が動作するハードウェアです。
ここでは、Yocto で Linux イメージをビルド可能、かつ、入手しやすい Arm マシンとして、RPi 3B を使います。
ターゲットマシンで動作する Linux をビルドする開発環境です。ここでは、Yocto を想定しますが、別の開発環境をご使用の場合は、読み替えてください。
構築ホストには Ubuntu 20.04.4 (Virtualbox) を使用します。Yocto バージョンは執筆時点(2022/09/01)での最新 LTS の Kirkstone 4.0.3 を使用します。
必要なレイヤーは次の通りです。
● Yocto 構築に必要なパッケージを取得します。(下記リンク参照)
$ 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 関連のコンフィグ
● 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
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
取得したトレースログを kernelshark で表示する解析環境です。開発環境と同一で構いません。 ここでは、開発環境と同一の Ubuntu 20.04.4(Virtualbox)を使用します。
kernelshark をインストールします。
$ sudo apt install kernelshark
kernelshark をインストールする際に、trace-cmd も一緒にインストールされます。
kernelshark を起動します。
$ kernelshark
または、
$ kernelshark <トレースログのパス>
トレースログを引数に指定して実行することで、そのファイルを開くことができます。引数なしで起動し、メニュー File -> Open よりトレースログを開くことも可能です。引数なしで起動した場合、trace.dat が存在すれば、それを開きます。
2024 年 09 月 02 日 Vigiles サポート
2024 年 03 月 01 日 Vigiles サポート
2023 年 08 月 28 日 Vigiles サポート
2024 年 03 月 26 日 Yocto Project よもやま話
2023 年 07 月 25 日 Yocto Project よもやま話
2023 年 06 月 20 日 Yocto Project よもやま話
2024 年 01 月 10 日 Linux 技術ネタ
2023 年 12 月 12 日 Linux 技術ネタ
2023 年 03 月 31 日 Linux 技術ネタ
2024 年 07 月 26 日 イベントレポート
2024 年 07 月 09 日 イベントレポート
2024 年 06 月 03 日 イベントレポート
2023 年 05 月 30 日 リクルート
2022 年 12 月 27 日 リクルート
2022 年 09 月 27 日 リクルート
2024 年 09 月 25 日 信州リネオ便り
2024 年 08 月 20 日 信州リネオ便り
2024 年 08 月 07 日 信州リネオ便り
2019 年 12 月 10 日 ソリューション統括部
2019 年 12 月 10 日 ソリューション統括部
2019 年 12 月 10 日 ソリューション統括部
2019 年 12 月 13 日 マーケティング統括部
2019 年 04 月 25 日 マーケティング統括部
2018 年 12 月 18 日 マーケティング統括部