はじめに
こんにちは!今回はstraceコマンドについて解説します。
straceはプロセスが実行するシステムコール(Linux カーネルへのリクエスト)をリアルタイムで追跡するコマンドです。プログラムがファイルを開いたり、ネットワークに接続したり、メモリを確保したりする時、その動きを全部見ることができます。
デバッグやトラブルシューティングで「このプログラム、何してるんだろう?」って時に超便利ですよ。
straceコマンドとは
straceは、プロセスの動作を詳細に追跡するデバッグツールです。“system call trace"の略ですね。
プログラムが実行するすべてのシステムコールを表示します。ファイルの読み書き、プロセス生成、シグナル処理、ネットワーク通信など、あらゆるカーネルとのやり取りが記録されます。
「このコマンド、なぜ遅いのか」「なぜエラーが出るのか」という問題を調べる時に活躍します。プログラム開発者やシステム管理者の強い味方です。
基本構文
|
|
指定したコマンドを実行しながら、システムコールをリアルタイムで表示します。
|
|
実行中のプロセス(PID)にアタッチしてトレースすることもできます。
主なオプション
| オプション | 説明 |
|---|---|
-e trace=SYSCALL |
特定のシステムコール(例:open, read)のみを表示 |
-o FILE |
出力をファイルに保存 |
-p PID |
実行中のプロセスをアタッチしてトレース |
-f |
子プロセスも一緒にトレース |
-c |
システムコール統計を表示 |
-v |
詳細表示(構造体の内容なども表示) |
-e write |
write系のシステムコール(write, pwrite64など)をトレース |
-e open,read |
複数のシステムコールを指定 |
-s NUM |
表示する文字列の最大長を指定(デフォルト32) |
-x |
16進数で表示 |
--follow-forks |
-fと同じ(フォークを追跡) |
使用例
例1: 基本的なトレース
|
|
実行結果:
|
|
lsコマンドが実行する全システムコールが表示されます。たくさん出ますね。
例2: 特定のシステムコールのみを表示
|
|
実行結果:
|
|
openとreadシステムコールだけが表示されます。ノイズが減ってわかりやすいですね。
例3: 出力をファイルに保存
|
|
実行結果:
|
|
トレース結果をoutput.logに保存します。ログを後で確認できるので便利です。
例4: 統計情報を表示
|
|
実行結果:
|
|
システムコール別の実行時間と呼び出し回数の統計を表示。どのシステムコールが遅いかわかります。
例5: write系のシステムコールをトレース
|
|
実行結果:
|
|
echoが標準出力(FD 1)に"Hello, Linux!\n"と14バイト書き込んでいることがわかります。
例6: 実行中のプロセスにアタッチ
|
|
実行結果:
|
|
|
|
実行結果:
|
|
実行中のsleepプロセスにアタッチしてトレースします。(権限不足の場合はsudoが必要)
例7: 子プロセスもトレース
|
|
実行結果:
|
|
-fフラグで子プロセスも追跡されます。パイプやコマンド連鎖の動きが見えます。
例8: ファイルオープンのトレース
|
|
実行結果:
|
|
ファイルがどうやって開かれるかがわかります。openatが使われているんですね。
例9: エラーを追跡
|
|
実行結果:
|
|
-1とENOENTエラーが表示されます。「なぜ失敗したか」がすぐわかります。
例10: ネットワーク通信をトレース
|
|
実行結果:
|
|
HTTPやDNS通信の詳細が見えます。
Tips・注意点
出力が多い場合はフィルタリング
straceの出力は膨大です。必ず-e trace=でフィルタリングしましょう。
|
|
標準出力とトレース出力を分ける
|
|
-oで出力をファイルに保存すれば、コマンドの結果はそのまま表示されます。
権限が必要な場合がある
実行中のプロセスにアタッチするときはsudoが必要な場合があります。
|
|
統計情報は最後に表示
|
|
-cで統計を見たい時は、出力の最後の方を見ましょう。
実践的な使い方
プログラムが遅い理由を調べる
|
|
統計を見て、どのシステムコールに時間がかかってるか調べます。
ファイルアクセスパターンを分析
|
|
プログラムがどんなファイルにアクセスしているか、読み込みと書き込みのバランスはどうかがわかります。
デバッグ:プログラムがクラッシュする直前の動作
|
|
クラッシュ直前のシステムコール列を見れば、原因がわかることがあります。
ネットワーク通信の確認
|
|
HTTPクライアントがどう通信しているか追跡できます。
まとめ
straceコマンドのポイント:
- プロセスが実行するシステムコールを追跡する強力なデバッグツール
- -e trace=: 特定のシステムコール(open, read, writeなど)をフィルタリング
- -o FILE: 出力をファイルに保存
- -c: システムコール統計を表示(パフォーマンス分析に最適)
- -f: 子プロセスもトレース
- -p PID: 実行中のプロセスにアタッチ
- よく使う組み合わせ:
strace -e trace=open,read -o log.txt command
プログラムが何してるか不可解な時は、straceで追跡して真実を見ましょう。デバッグの最強の武器ですよ!