Red Hat Training

A Red Hat training course is available for RHEL 8

3.3. アプリケーションの対話の記録

アプリケーションの実行可能コードは、オペレーティングシステムや共有ライブラリーのコードと対話します。この相互作用のアクティビティーログを記録すると、実際のアプリケーションコードをデバッグしなくても、アプリケーションの動作を十分に把握できます。または、アプリケーションの相互作用を分析することで、バグが現れる条件を特定するのに役立ちます。

3.3.1. アプリケーションの相互作用の記録に役立つツール

Red Hat Enterprise Linux は、アプリケーションの相互作用を分析するための複数のツールを提供しています。

strace

strace ツールでは主に、アプリケーションが使用するシステムコール (カーネル関数) のロギングが可能になります。

  • strace がパラメーターを解釈し、下層のカーネルコードに関する知識が得られるため、strace ツールでは呼び出しに関する詳細な出力が得られます。数値は、定数名、フラグリストにデプロイメントされたビット単位の結合フラグ、実際の文字列を提供するために逆参照された文字配列へのポインターなどにそれぞれ変換されます。最新のカーネル機能のサポートがない場合があります。
  • トレースされた呼び出しをフィルタリングして、取得するデータ量を減らすことができます。
  • strace を使用するために、ログフィルターの設定以外に、特別な設定は必要ありません。
  • strace でアプリケーションコードを追跡すると、アプリケーションの実行速度が大幅に遅くなるため、strace は、多くの実稼働環境のデプロイメントには適しません。代替方法として、ltrace または SystemTap の使用を検討してください。
  • Red Hat Developer Toolset で利用可能な strace のバージョンでは、システムコールの改ざんも行えます。この機能は、デバッグに役立ちます。
ltrace

ltrace ツールを使用すると、アプリケーションのユーザー空間呼び出しを共有オブジェクト (動的ライブラリー) に記録できます。

  • ltrace ツールを使用すると、ライブラリーへの呼び出しを追跡できます。
  • トレースされた呼び出しをフィルタリングして、取得するデータ量を減らすことができます。
  • ltrace を使用するために、ログフィルターの設定以外に、特別な設定は必要ありません。
  • ltrace ツールは軽量で高速で、strace に代わる機能を提供します。strace でカーネルの関数を追跡する代わりに、ltraceglibc など、ライブラリー内の各インターフェイスを追跡できます。
  • ltrace は、strace などの既知の呼び出しを処理しないため、ライブラリー関数に渡す値を記述することができません。ltrace の出力には、生の数値およびポインターのみが含まれます。ltrace の出力の解釈には、出力にあるライブラリーの実際のインターフェイス宣言を確認する必要があります。
注記

Red Hat Enterprise Linux 8 では、既知の問題により、ltrace が実行ファイルを追跡できなくなります。この制限は、ユーザーが構築する実行ファイルには適用されません。

SystemTap

SystemTap は、Linux システム上で実行中のプロセスおよびカーネルアクティビティーを調査するための有用なインストルメンテーションプラットフォームです。SystemTap は、独自のスクリプト言語を使用してカスタムイベントハンドラーをプログラミングします。

  • straceltrace の使用と比較した場合、ロギングのスクリプトを作成すると、初期の設定フェーズでより多くの作業が必要になります。ただし、スクリプト機能は単にログを生成するだけでなく、SystemTap の有用性を高めます。
  • SystemTap は、カーネルモジュールを作成し、挿入すると機能します。SystemTap は効率的に使用でき、システムまたはアプリケーションの実行速度が大幅に低下することはありません。
  • SystemTap には一連の使用例が提供されます。
GDB

GNU デバッガー (GDB) は主に、ロギングではなく、デバッグを目的としています。ただし、その機能の一部は、アプリケーションの相互作用が重要な主要なアクティビティーであるシナリオでも有用です。

  • GDB を使用すると、相互作用イベントを取得して、後続の実行パスの即時デバッグを簡単に組み合わせることができます。
  • GDB は、他のツールで問題のある状況を最初に特定した後、まれなイベントまたは特異なイベントへの応答を分析するのに最適です。イベントが頻繁に発生するシナリオで GDB を使用すると、効率が悪くなったり、不可能になったりします。

3.3.2. strace でアプリケーションのシステムコールの監視

strace ツールは、アプリケーションを実行するシステム (カーネル) コールの監視を有効にします。

手順

  1. 監視するシステムコールを特定します。
  2. strace を起動して、プログラムに割り当てます。

    • 監視するプログラムが実行していない場合は、strace を起動して、プログラム を指定します。

      $ strace -fvttTyy -s 256 -e trace=call program
    • プログラムがすでに実行中の場合は、プロセス id (pid) を検索して、その id に strace を割り当てます。

      $ ps -C program
      (...)
      $ strace -fvttTyy -s 256 -e trace=call -ppid
    • call を、表示するシステムコールに置き換えます。-e trace=call オプションを複数回使用できます。何も指定しない場合、strace はすべてのシステムコールタイプを表示します。詳細は、man ページの strace(1) を参照してください。
    • フォークしたプロセスまたはスレッドを追跡しない場合は、-f オプションを指定しないでください。
  3. strace は、アプリケーションで作成したシステムコールとその詳細を表示します。

    ほとんどの場合、システムコールのフィルターが設定されていないと、アプリケーションとそのライブラリーは多数の呼び出しを行い、strace 出力がすぐに表示されます。

  4. strace ツールは、プログラムの終了時に、終了します。

    追跡しているプログラムの終了前に監視を中断するには、Ctrl+C を押します。

    • strace でプログラムを起動すると、そのプログラムは strace とともに中断します。
    • 実行中のプログラムに strace を割り当てると、そのプログラムは strace とともに中断します。
  5. アプリケーションが実行したシステム呼び出しのリストを分析します。

    • リソースへのアクセスや可用性の問題は、エラーを返す呼び出しとしてログに表示されます。
    • システムコールに渡される値とコールシーケンスのパターンは、アプリケーションの動作の原因に関する洞察を提供します。
    • アプリケーションがクラッシュした場合、重要な情報はおそらくログの最後にあります。
    • 出力には不要な情報が多く含まれています。ただし、目的のシステムコールに対してより正確なフィルターを作成し、この手順を繰り返すことができます。
注記

出力を確認することにも、ファイルに保存することにも利点があります。これを行うには、tee コマンドを使用します。

$ strace ... |& tee your_log_file.log

関連情報

3.3.3. ltrace でアプリケーションのライブラリー関数呼び出しの監視

ltrace ツールは、ライブラリー (共有オブジェクト) で利用可能な関数へのアプリケーションの呼び出しを監視できます。

注記

Red Hat Enterprise Linux 8 では、既知の問題により、ltrace が実行ファイルを追跡できなくなります。この制限は、ユーザーが構築する実行ファイルには適用されません。

手順

  1. 可能であれば、対象のライブラリーおよび関数を特定します。
  2. ltrace を起動し、プログラムに割り当てます。

    • 監視するプログラムが実行していない場合は、ltrace を起動して、プログラム を指定します。

      $ ltrace -f -l library -e function program
    • プログラムがすでに実行中の場合は、プロセス id (pid) を検索して、その id に ltrace を割り当てます。

      $ ps -C program
      (...)
      $ ltrace -f -l library -e function program -ppid
    • -e オプション、-f オプション、および -l オプションを使用して、出力にフィルターを設定します。

      • function として表示される関数の名前を指定します。-e function オプションは複数回使用できます。何も指定しないと、ltrace は全関数への呼び出しを表示します。
      • 関数を指定する代わりに、-l library オプションでライブラリー全体を指定できます。このオプションは、-e function オプションと同じように動作します。
      • フォークしたプロセスまたはスレッドを追跡しない場合は、-f オプションを指定しないでください。

      詳細情報は、man ページの ltrace(1) を参照してください。

  3. ltrace は、アプリケーションにより作成されたライブラリーコールを表示します。

    多くの場合は、フィルターが設定されていないと、アプリケーションは多数の呼び出しを作成し、ltrace の出力がすぐに表示されます。

  4. ltrace は、プログラムが終了すると終了します。

    追跡しているプログラムの終了前に監視を中断するには、ctrl+C を押します。

    • ltrace でプログラムを起動した場合には、プログラムは ltrace と共に中断します。
    • 実行中のプログラムに ltrace を割り当てると、プログラムは ltrace と共に終了します。
  5. アプリケーションが実行したライブラリーコールのリストを分析します。

    • アプリケーションがクラッシュした場合、重要な情報はおそらくログの最後にあります。
    • 出力には不要な情報が多く含まれています。ただし、より正確なフィルターを作成して、手順を繰り返すことができます。
注記

出力を確認することにも、ファイルに保存することにも利点があります。これを行うには、tee コマンドを使用します。

$ ltrace ... |& tee your_log_file.log

関連情報

  • man ページの ltrace (1)

    $ man ltrace
  • Red Hat Developer Toolset ユーザーガイドの ltrace の章

3.3.4. SystemTap を使用したアプリケーションのシステムコールの監視

SystemTap ツールでは、カーネルイベントにカスタムイベントハンドラーを登録できます。strace ツールと比較すると、使用は難しくなりますが、より効率的でより複雑な処理ロジックを使用できます。strace.stp と呼ばれる SystemTap スクリプトは SystemTap と共にインストールされ、SystemTap を使用して strace に類似の機能を提供します。

手順

  1. 監視するプロセスのプロセス ID (pid) を検索します。

    $ ps -aux
  2. strace.stp スクリプトで SystemTap を実行します。

    # stap /usr/share/systemtap/examples/process/strace.stp -x pid

    pid の値は、プロセス ID です。

    スクリプトはカーネルモジュールにコンパイルされ、それが読み込まれます。これにより、コマンドの入力から出力の取得までにわずかな遅延が生じます。

  3. プロセスでシステム呼び出しが実行されると、呼び出し名とパラメーターがターミナルに出力されます。
  4. プロセスが終了した場合、または Ctrl+C を押すと、スクリプトは終了します。

3.3.5. GDB を使用したアプリケーションのシステムコールの傍受

GNU デバッガー (GDB) により、プログラムの実行中に発生するさまざまな状況で実行を停止できます。プログラムがシステムコールを実行するときに実行を停止するには、GDB の チェックポイント を使用します。

手順

  1. キャッチポイントを設定します。

    (gdb) catch syscall syscall-name

    catch syscall コマンドは、プログラムがシステムコールを実行する際に実行を停止する特別なブレークポイントを設定します。

    syscall-name オプションは、コールの名前を指定します。様々なシステム呼び出しに対して複数のキャッチポイントを指定することができます。syscall-name オプションを指定しないと、システムコールで GDB が停止します。

  2. プログラムの実行を開始します。

    • プログラムにより、実行が開始していない場合は開始します。

      (gdb) r
    • プログラムの実行が停止した場合は、再開します。

      (gdb) c
  3. GDB は、プログラムが指定のシステムコールを実行した後に実行を停止します。

3.3.6. GDB を使用したアプリケーションによるシグナル処理のインターセプト

GNU デバッガー (GDB) により、プログラムの実行中に発生するさまざまな状況で実行を停止できます。プログラムがオペレーティングシステムからシグナルを受信するときに実行を停止するには、GDB の キャッチポイント を使用します。

手順

  1. キャッチポイントを設定します。

    (gdb) catch signal signal-type

    catch signal コマンドは、プログラムがシステムコールを受けたときに実行を停止する特別なブレークポイントを設定します。signal-type オプションは、シグナルのタイプを指定します。すべてのシグナルを取得するには、特別な値 all を使用します。

  2. プログラムを実行します。

    • プログラムにより、実行が開始していない場合は開始します。

      (gdb) r
    • プログラムの実行が停止した場合は、再開します。

      (gdb) c
  3. GDB は、プログラムが指定のシグナルを受けると実行を停止します。