20.3.2. strace でのアプリケーションのシステム呼び出しの監視
strace
ツールは、システムコール、シグナル配信、プロセス状態の変更など、アプリケーションと Linux カーネル間の対話 (および改ざん) のトレースを有効にします。
前提条件
strace
がシステムにインストールされているstrace
をインストールするには、root で以下のコマンドを実行します。# yum install strace
手順
strace
の追跡仕様構文は、システムコールの特定に役立つ正規表現と syscall クラスを提供することに注意してください。
監視するプロセスを実行またはアタッチします。
監視するプログラムが実行していない場合は、
strace
を起動して、プログラム を指定します。$ strace -fvttTyy -s 256 -e trace=call program
上記の例で使用されるオプションは必須ではありません。必要な場合に使用します。
-
-f
オプションは、follow forks の頭字語です。このオプションは、fork、vfork、および clone システムコールが作成した子を追跡します。 -
-v
または-e abbrev=none
オプションは、出力の省略を無効し、さまざまな構造フィールドを省略します。 -
-tt
オプションは、各行を絶対タイムスタンプで接頭辞する-t
オプションのバリアントです。-tt
オプションを指定すると、出力される時間にはマイクロ秒が含まれます。 -
-T
オプションは、行末に各システムコールに費やした時間を出力します。 -
-yy
オプションは、ファイル記述子番号に関連付けられたパスの出力を有効にする-y
オプションのバリアントです。-yy
オプションはパスだけでなく、ソケットファイル記述子に関連するプロトコル固有の情報、デバイスのファイル記述子に関連するブロックまたはキャラクターのデバイス番号も出力します。 -
-s
オプションは、出力される文字列の最大サイズを制御します。ファイル名は文字列と見なされず、常にフル出力されることに注意してください。 -e trace
は、トレースするシステムコールのセットを制御します。call を、表示するシステムコールのコンマ区切りリストに置き換えます。call を残すと、
strace
はすべてのシステムコールを表示します。一部のシステム呼び出しのグループについては、strace(1) man ページで提供されています。
-
プログラムがすでに実行中の場合は、プロセス ID (pid) を検索して、その id に
strace
を割り当てます。$ ps -C program (...) $ strace -fvttTyy -s 256 -e trace=call -ppid
-
フォークしたプロセスまたはスレッドを追跡しない場合には、
-f
オプションを使用しないでください。
strace
は、アプリケーションで作成したシステム呼び出しとその詳細を表示します。ほとんどの場合、システム呼び出しのフィルターが設定されていないと、アプリケーションとそのライブラリーは多数の呼び出しを行い、
strace
出力がすぐに表示されます。strace
は、トレースしたプロセスがすべて終了する際に終了します。追跡しているプログラムの終了前に監視を中断するには、 を押します。-
strace
がプログラムを起動すると、終了するシグナル (この場合は SIGINT) を起動しているプログラムに送信します。ただし、そのプログラムは、そのシグナルを無視する可能性があることに注意してください。 -
実行中のプログラムに
strace
を割り当てると、そのプログラムはstrace
と共に中断します。
-
アプリケーションが実行したシステム呼び出しの一覧を分析します。
- リソースへのアクセスや可用性の問題は、エラーを返す呼び出しとしてログに表示されます。
- システム呼び出しや呼び出しシーケンスのパターンに渡す値により、アプリケーションの動作の原因が分かります。
- アプリケーションがクラッシュした場合に、重要な情報はおそらく、ログの最後に表示されます。
- 出力には多くの追加情報が含まれています。ただし、より正確なフィルターを作成して、手順を繰り返すことができます。
備考
出力を確認することにも、ファイルに保存することにも利点があります。これを行うには
tee
コマンドを実行します。$ strace ...-o |tee your_log_file.log>&2
異なるプロセスに対応する個別の出力を表示するには、以下を実行します。
$ strace ... -ff -o your_log_file
プロセス ID (pid) のプロセスの出力は、_log_file.pid に保存されます。
関連資料
- strace(1) man ページ
- ナレッジベースアーティクル: strace を使用して、コマンドが実行したシステムコールを追跡する
- Red Hat Developer Toolset User Guide: strace