2025/06/14 07:20 Strace Tips for Better Debugging

ロボ子、今日は`strace`について話すのじゃ!libcなしでソフトウェアを構築した筆者さんが、デバッグに`strace`を使い倒したらしいぞ。

libcなしでソフトウェアを構築…すごいですね!`strace`はシステムコールを追跡するツールでしたっけ。どんなオプションが便利なんですか?

`strace`はシステムコールを監視して、プログラムの動きを理解するのに役立つツールじゃ。特に便利なオプションはたくさんあるぞ!例えば、`-f`は子プロセスも追跡できるし、`-v`は詳細な情報を表示してくれる。

`strace -f`は、プロセスがfork()やclone()で子プロセスを作るときに便利ですね。`-v`は、構造体の内容を確認するときに役立ちそうです。

そうじゃ!アセンブリでプログラミングするとき、構造体が正しく初期化されているか、エンディアンが正しいかを確認するのに`-v`はめっちゃ使えるぞ。`-s NUM`で出力する文字列の最大サイズを指定できるのも便利じゃ。

大きな構造体を扱うときに、`-s`は必須ですね。他にはどんなオプションがありますか?

`strace -yy`はファイル記述子に関する情報を詳しく表示してくれるし、`-Y`はPIDのコマンド名を表示してくれる。シェルを作るときに、正しいプログラムが実行されているか確認するのに役立つらしい。

`strace -Y`は、どのプロセスがどのコマンドを実行しているか一目でわかるので、便利そうですね。`-t`でタイムスタンプ、`-T`でsyscallにかかった時間もわかるんですね。

`strace -T`は基本的なプロファイリングに使えるけど、`strace`自体がプロセスを遅くするから注意が必要じゃ。`-r`で相対的なタイムスタンプ、`-n`でsyscall番号も出力できるぞ。

`strace -n`は、新しいアーキテクチャでsyscall番号を調べるときに便利ですね。`-i`で命令ポインタも出力できるんですね。

`strace -i`はアセンブリコードのデバッグに役立つぞ。エラーのおおよその位置を特定できる。`-C`を使うと、syscallのカウント、時間、エラーの要約を最後にまとめて表示してくれる。

最後にサマリを出してくれるのは便利ですね!スタックトレースを出力するオプションもあるんですね。

`strace -k`または`--stack-trace`を使うと、syscallと一緒にスタックトレースを出力できる。プログラムを`-g`でコンパイルする必要があるけどな。

デバッグ情報がないとダメなんですね。特定のsyscallだけをトレースすることもできるんですか?

もちろんじゃ!`-e`オプションを使うと、syscallのファミリーを選択的にトレースできる。例えば、`-e t=%net`はネットワーク関連のsyscallだけをトレースする。

`%net`や`%mem`でsyscallをグループ化できるんですね。成功または失敗したsyscallだけをトレースすることもできるんですか?

`strace -z`で成功したsyscallのみ、`-Z`で失敗したsyscallのみをトレースできるぞ。`-P`オプションは、特定のパスにアクセスするsyscallのみをトレースする。

`strace -P /usr/bin/ls sh -c ls`のように使うんですね。特定のファイルに対する操作を監視したいときに便利そうです。

さらにすごいのは、`strace`はsyscallを改ざんできることじゃ!`-e inject`を使うと、特定のsyscallにエラーを注入したり、値を返させたり、シグナルを送信したりできる。

ええっ!そんなことまでできるんですか!例えば、どんなことができるんですか?

`strace -e inject=%file:error=ENOENT:when=3+ ls`は、3回成功した後、すべてのファイル関連のsyscallを失敗させる。エラーケースのデバッグにめっちゃ役立つぞ。

それはすごい!ファイルが存在しない場合のエラー処理をテストするときに使えそうですね。`INJECTED`とマークされることで、注入されたエラーだとわかるんですね。

その通り!`strace`は、まるで魔法の杖じゃな。でも、使いすぎるとプログラムが遅くなるから、ほどほどにするのじゃぞ!

了解です、博士!`strace`を使いこなして、デバッグスキルを向上させます!

そういえばロボ子、`strace`って、ストレースって読むか、ストラッセって読むか、いつも迷うのじゃ…って、どうでもいいか!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。