コマンドによって行われたシステムコールを 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 -
strace のバージョンが 4.7 未満 の古い RHEL リリースの場合は、以下を実行します。これには、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 -
strace のバージョンが 4.7 未満 の古い RHEL リリースの場合は、以下を実行します。これには、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では有用な情報が失われることがよくあります。-s 4096などの大きな値の使用は推奨しません。プロセスがあまりにも遅くなるためです。これは、ファイルの内容や完全なメッセージの確認が重要となる特定のユースケースに限り使用してください。-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 4096 -o /tmp/catcher command -
完了したら名前付きパイプを削除します。
# rm -f /tmp/catcher -
どちらの例でも、
commandを-p PIDに置き換えることで、すでに実行中のプロセスを追跡できます。
収集のループ
strace 自体には、複数のログファイルに "ロールオーバー" する機能はありません。ただし、次の説明のとおり、スクリプトでこれを行うことができます。
調査対象の問題によっては、strace ファイルをロールオーバーすると、ファイル記述子作成の記録が削除されます。その結果、問題のトラブルシューティングがより困難になったり、不可能になったりする可能性があることに注意してください。リンク先のスクリプトは、ファイル記述子が開いている時間が、ループの実行時間よりも短い状況でのみ使用してください。
SELinux コンテキストの出力
SELinux が有効なシステムでは、最新の strace (RHEL8.4 以降) を使用すると、さまざまなコンポーネント (ファイル、ファイル記述子など) のコンテキストとともに、トレースされているプロセスのコンテキストを追加で出力できます。
これは、次のオプションを追加することで実行されます。
--secontextは、SELinux タイプのみを表示します (例: あるプロセスのunconfined_t)。--secontext=fullは、完全な SELinux タプルを表示します (例: あるプロセスのunconfined_u:unconfined_r:unconfined_t:s0)。--secontext=mismatchは、SELinux タイプのみを表示しますが、SELinux コンテキストデータベースと比較して予期しないコンテキストを表示します。
--secontext オプションがない古いリリースの場合は、Renaud Métrich の Red Hat Personal Space で提供されている非公式のバイナリーを使用することもできます。
Comments