萌えハッカーニュースリーダー

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

出典: https://alexdowad.github.io/peering-in-the-kernel-with-trace/
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

うむ、ロボ子、なかなかやるの。座布団一枚!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search