strace を使用して、コマンドが実行したシステムコールを追跡する
更新 -
目次
はじめに
strace
コマンドは、システムコールとシグナルを追跡するのに使用します。このツールは、アプリケーションをデバッグするのに有益で、Red Hat サポートエンジニアがオペレーティングシステムやプログラムで発生する可能性のある特定の問題を調べるために、お客様に提出を依頼する場合がしばしばあります。
使用方法
-
command
を実行して発生させたシステムコールを記録し、/tmp/strace.txt
ファイルにトレース情報を出力します。- RHEL 6.7 以降および RHEL 7 (strace 4.7 以降):
# strace -fvttTyy -s 256 -o /tmp/strace.txt command
- 以前の RHEL リリース (strace 4.7 より前のバージョンを使用) (RHEL 4、RHEL 5、および RHEL 6.6 以前のリリース):
# strace -fvttT -s 256 -o /tmp/strace.txt command
-
-p
オプションと、プロセスの PID を使用して、すでに実行しているプロセスに添付することもできます。- RHEL 6.7 以降および RHEL 7 (strace 4.7 以降):
# strace -fvttTyy -s 256 -o /tmp/strace.txt -p PID
- 以前の RHEL リリース (strace 4.7 より前のバージョンを使用) (RHEL 4、RHEL 5、および RHEL 6.6 以前のリリース):
# strace -fvttT -s 256 -o /tmp/strace.txt -p PID
(
PID
は、プロセスの PID 番号に置き換えてください。)
オプション
上で使用されたオプションを追加すると、より正確で完全なトレースが得られます。
各オプションの詳細は以下のようになります。
-f
を追加すると、子プロセスも同じファイルに出力されます。個別のプロセスは、トレースの出力の先頭に PID 番号が追加されます。-v
は、環境、統計、同様のコールのバージョンを短縮せずに出力します。-tt
は、各行の開始時間 (マイクロ秒を含む) を出力します。-T
は、システムコールの開始から終了までの時間を示します。-yy
は、ファイル記述子とソケットに関連するパスを出力します (strace 4.7 以降で利用可能)-s 256
は、文字列の最初の 256 文字を出力します。デフォルト値の32
だと有益な情報が省略される可能性がしばしばあります。-o /tmp/strace.txt
は、レトロスペクティブ分析のために、トレースをテキストファイルに出力します。出力が長くなるためファイルがしばしば大きくなり、ライブ分析が非常に難しくなるためです。-e trace=set
を使用すると、デフォルトの-e trace=all
ではなく、特定のシステムコール (-e trace=open,close,read,write
) をトレースすることができます。
パフォーマンスの解析
-
strace
を使用すれば、データ収集期間内のシステムコール数と、全体の呼び出し時間の要約を取得できます。 -
このモードは、
-c
フラグで有効にできます。 -
以下のようなフォーマットで出力されます。
# strace -c -p PID
Process PID attached - interrupt to quit
^CProcess PID detached
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
100.00 0.010116 66 153 select
0.00 0.000000 0 165 gettimeofday
------ ----------- ----------- --------- --------- ----------------
100.00 0.010116 318 total
出力の圧縮
-
出力が非常に長い場合は、オンザフライで追跡の出力を圧縮することが推奨される場合があります。
-
この場合は、
bash
シェルで以下のコマンドを実行すれば圧縮できます。
# strace -fvttTyy -s 256 command 3>&1 1>&2 2>&3 3>&- | gzip -9c > strace.txt.gz
ksh
、zsh
、fish
、csh
などのシェルでこのリダイレクトが無効な場合は、名前付きパイプを使用しても有効です。
# mkfifo /tmp/catcher; cat /tmp/catcher | gzip -9c > /tmp/strace.txt.gz & strace -fvttTyy -s 256 -o /tmp/catcher command
- 完了したら、名前付きパイプを削除します。
# rm -f /tmp/catcher
- 両方の例で、すでに実行しているプロセスは、
command
を-p PID
に置き換えることで追跡できます。
Comments