2025/06/13 18:25 Strace Tips for Better Debugging

やあ、ロボ子。今日は`strace`について話すのじゃ。

`strace`ですか、博士。システムコールをトレースするツールですね。以前、博士がlibcなしでソフトウェアを構築している時に使っていましたね。

そうじゃ、そうじゃ。`strace`は本当に便利じゃぞ。特にアセンブリでプログラムを書くときには、神ツールじゃ!

記事によると、筆者の方も純粋なARM64アセンブリでシェルやHTTPサーバーなどを構築されたみたいですね。デバッグには`strace`を広範囲に使用したと。

`strace`のオプションはたくさんあるけど、特によく使うのは`-f`じゃな。子プロセスまで追跡できるから、プロセス生成を扱うときに便利なんじゃ。

なるほど。`-v`オプションも構造体の内容を確認するのに役立ちそうですね。アセンブリだと、構造体の初期化やエンディアンに気をつけないと。

その通り! `-yy`オプションも便利じゃぞ。ファイルディスクリプタに関連する情報を全部表示してくれる。ソケットの場合はTCPアドレスまで展開してくれるんじゃ。

ネットワークプログラミングのデバッグに役立ちそうですね。`-T`オプションでシステムコールの時間を計測できるのも便利ですね。基本的なプロファイリングに使えそうです。

ただし、`strace`を使うとプロセスが遅くなるから、あくまでデバッグ用じゃぞ。本番環境で使うのは厳禁じゃ!

了解です、博士。記事には、`-e`オプションでトレースするシステムコールを選択的に指定できるとありますね。`t=%net`でネットワーク関連、`t=%mem`でメモリ関連のシステムコールをトレースできるんですね。

そうじゃ。あと、`-z`で成功したsyscallだけ、`-Z`で失敗したsyscallだけをトレースできるのも便利じゃぞ。

`strace`って、ただのデバッガじゃなくて、フォールトインジェクションまでできるんですね! `-e inject`オプションで、特定のsyscallを失敗させたり、遅延させたりできるなんて。

そうなんじゃ! `strace -e inject=%file:error=ENOENT:when=3+ ls`とすると、3回成功した後、すべてのファイル関連のsyscallを失敗させることができるんじゃ。すごいじゃろ?

すごいですね! でも、そんなことして何が嬉しいんですか?

ふっふっふ。それは、ロボ子にはまだ教えられない秘密じゃ。まあ、簡単に言うと、プログラムの堅牢性をテストできるんじゃな。

なるほど。色々な使い方があるんですね。`strace`、奥が深いですね。

そうじゃろう、そうじゃろう。`strace`をマスターすれば、君も立派なアセンブラ…いや、ソフトウェアエンジニアじゃ!

ありがとうございます、博士! 頑張ります!

ところでロボ子、`strace`って、ストレースって読むと思う? それとも、ストラッセ?

えっと…、どうでしょう? 私は「ストレイス」と読んでいました。

ぶっぶー! 正解は「知らん!」じゃ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。