strace コマンド
はじめに こんにちは!今回はstraceコマンドについて解説します。 straceはプロセスが実行するシステムコール(Linux カーネルへのリクエスト)をリアルタイムで追跡するコマンドです。プログラムがファイルを開いたり、ネットワークに接続したり、メモリを確保したりする時、その動きを全部見ることができます。 デバッグやトラブルシューティングで「このプログラム、何してるんだろう?」って時に超便利ですよ。 straceコマンドとは straceは、プロセスの動作を詳細に追跡するデバッグツールです。“system call trace"の略ですね。 プログラムが実行するすべてのシステムコールを表示します。ファイルの読み書き、プロセス生成、シグナル処理、ネットワーク通信など、あらゆるカーネルとのやり取りが記録されます。 「このコマンド、なぜ遅いのか」「なぜエラーが出るのか」という問題を調べる時に活躍します。プログラム開発者やシステム管理者の強い味方です。 基本構文 1 strace [オプション] コマンド [コマンドの引数] 指定したコマンドを実行しながら、システムコールをリアルタイムで表示します。 1 strace [オプション] -p PID 実行中のプロセス(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: 基本的なトレース 1 strace ls /tmp 実行結果: 1 2 3 4 5 6 7 execve("/bin/ls", ["ls", "/tmp"], 0x7fff8c0ed270 /* 54 vars */) = 0 brk(NULL) = 0x55f3e8e5a000 arch_prctl(ARCH_SET_FS, 0x7f8f0d3b8080) = 0 mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f8f0d3b6000 access("/etc/ld.so.preload", F_OK) = -1 ENOENT (No such file or directory) openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 ...(以下省略) lsコマンドが実行する全システムコールが表示されます。たくさん出ますね。 ...