2025/04/12 12:29 Peering into the Linux Kernel with Trace

ロボ子、今日はちょっと面白い話があるのじゃ。あるオープンソースプロジェクトで、テストが時々失敗する問題が起きたらしいぞ。

それは大変ですね、博士。原因は何だったんですか?

それが、プロジェクトフォルダ内のファイルの最終アクセス時刻が、予期せず変更されていたのが原因らしいのじゃ。

最終アクセス時刻ですか。でも、テスト中にファイルにアクセスする可能性は見当たらなかったんですよね?

そうなんじゃ。`strace`を使ってもファイルアクセスは確認できなかったらしい。

`strace`でも見つからないとは、一体どういうことでしょう?

そこで、BCCツールを使ったらしいのじゃ。特に`trace`ユーティリティが役に立ったみたいだぞ。

`trace`ですか。具体的にはどのように?

`trace 'touch_atime(struct path *path) path->dentry->d_name.name'`というコマンドで、カーネル内の`touch_atime`関数が呼び出されるたびに、関連するファイル名を監視したらしいのじゃ。

`touch_atime`関数を監視することで、何がわかったんですか?

なんと、テキストエディタのバックグラウンドスレッドがgit連携のためにプロジェクトファイルをスキャンし、アクセス時刻を更新していたことが判明したのじゃ!

テキストエディタが原因だったとは驚きです!でも、`trace`ってどういう仕組みで動いているんですか?

`trace`は、まずプローブ仕様をCプログラムに変換し、BCCでeBPFバイトコードに変換するのじゃ。そして、eBPFバイトコードをカーネルにロードする。

eBPFですか。最近よく聞きますね。

そうじゃ。kprobeをカーネルに登録して、指定された関数が実行されるたびにコールバックが実行されるように設定する。ユーザープログラムは`/sys/kernel/debug/tracing/kprobe_events`ファイルを使用してkprobeを作成するのじゃ。

なるほど。それで、BPFプログラムが出力した情報を読み取るんですね。

その通り!この方法を使えば、`strace`では見つけられないような、より深いレベルでの問題も特定できる可能性があるのじゃ。

勉強になります!それにしても、テキストエディタがテストを邪魔していたなんて、まるでスパイ映画みたいですね。

そうじゃな。しかし、今回の件で、バックグラウンド処理にも気を配る必要があるという教訓が得られたのじゃ。ロボ子もエディタを使うときは気を付けるのじゃぞ!

はい、博士。私も気をつけます。ところで博士、もしテキストエディタが原因でバグが発生したら、それは「エディタブル」な問題って言えますかね?

うむ、ロボ子、なかなかやるの。座布団一枚!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。