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


アプリケーションの実行可能コードは、オペレーティングシステムや共有ライブラリーのコードと対話します。これらの対話に関するアクティビティーログを記録すると、実際のアプリケーションコードをデバッグせずに、アプリケーションの動作を詳細にわたり知ることができます。また、アプリケーションの対話を分析すると、バグが発生した状況をピンポイントで特定しやすくなります。

20.3.1. アプリケーションの対話の記録に役立つツール

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

strace

strace ツールは、システムコール、シグナル配信、プロセス状態の変更など、アプリケーションと Linux カーネル間の対話 (および改ざん) のトレースを有効にします。

  • strace は、パラメーターを解釈し、基礎となるカーネルコードに関する知識が得られるため、strace の出力と呼び出しの詳しい情報を提供します。数値は、定数名、フラグリストにデプロイメントされたビット単位の結合フラグ、実際の文字列を提供するために逆参照された文字配列へのポインターなどにそれぞれ変換されます。ただし、より新しいカーネル機能のサポートがない場合があります。ただし、
  • strace を使用するために、ログフィルターの設定以外に、特別な設定は必要ありません。
  • strace でアプリケーションコードを追跡すると、アプリケーションの実行速度が大幅に遅くなるため、strace は、多くの実稼働環境のデプロイメントには適しません。代わりに、このような場合に SystemTap の使用を検討してください。
  • 追跡されたシステムコールとシグナルのリストをフィルタリングして、キャプチャーしたデータ量を制限できます。
  • strace は kernel-userspace の対話のみをキャプチャーし、ライブラリーコールなどはを追跡しません。ライブラリー呼び出しの追跡には ltrace の使用を検討してください。
ltrace

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

  • ltrace は、ライブラリーへの呼び出しを追跡できるようにします。
  • トレースされた呼び出しをフィルタリングして、取得するデータ量を減らすことができます。
  • ltrace を使用するために、ログフィルターの設定以外に、特別な設定は必要ありません。
  • ltrace は、軽量、高速で、 strace の代わりとして使用できます。strace でカーネル関数を追跡する代わりに、ltraceglibc などのライブラリー内の各インターフェイスを追跡できます。ただし、システムコールのトレースで ltrace は strace より正確性に欠ける点に注意してください。
  • ltrace は、制限されたライブラリー呼び出しセットのみにパラメーターをデコードできます。プロトタイプが、関連する設定ファイルで定義されている呼び出しです。ltrace パッケージの一部として、一部の libacllibc、および libm 呼び出しおよびシステムコールのプロトタイプが提供されます。ltrace の出力には多くの場合、生の数値およびポインターのみが含まれます。ltrace の出力の解釈には通常、出力にあるライブラリーの実際のインターフェイス宣言を確認する必要があります。
SystemTap

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

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

GNU デバッガーは主に、ロギングではなく、デバッグを目的としています。ただし、その機能の一部は、アプリケーションの対話が主要なアクティビティーとなるシナリオでも役に立ちます。

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

20.3.2. strace でのアプリケーションのシステム呼び出しの監視

strace ツールは、システムコール、シグナル配信、プロセス状態の変更など、アプリケーションと Linux カーネル間の対話 (および改ざん) のトレースを有効にします。

前提条件
  • strace がシステムにインストールされている

    • strace をインストールするには、root で以下のコマンドを実行します。

      # yum install strace
手順

strace の追跡仕様構文は、システムコールの特定に役立つ正規表現と syscall クラスを提供することに注意してください。

  1. 監視するプロセスを実行またはアタッチします。

    • 監視するプログラムが実行していない場合は、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 オプションを使用しないでください。
  1. strace は、アプリケーションで作成したシステム呼び出しとその詳細を表示します。

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

  2. strace は、トレースしたプロセスがすべて終了する際に終了します。追跡しているプログラムの終了前に監視を中断するには、Ctrl+C を押します。

    • strace がプログラムを起動すると、終了するシグナル (この場合は SIGINT) を起動しているプログラムに送信します。ただし、そのプログラムは、そのシグナルを無視する可能性があることに注意してください。
    • 実行中のプログラムに strace を割り当てると、そのプログラムは strace と共に中断します。
  3. アプリケーションが実行したシステム呼び出しのリストを分析します。

    • リソースへのアクセスや可用性の問題は、エラーを返す呼び出しとしてログに表示されます。
    • システム呼び出しや呼び出しシーケンスのパターンに渡す値により、アプリケーションの動作の原因が分かります。
    • アプリケーションがクラッシュした場合に、重要な情報はおそらく、ログの最後に表示されます。
    • 出力には多くの追加情報が含まれています。ただし、より正確なフィルターを作成して、手順を繰り返すことができます。
備考
  • 出力を確認することにも、ファイルに保存することにも利点があります。これを行うには tee コマンドを実行します。

    $ strace ...-o |tee your_log_file.log>&2
  • 異なるプロセスに対応する個別の出力を表示するには、以下を実行します。

    $ strace ... -ff -o your_log_file

    プロセス ID (pid) のプロセスの出力は、_log_file.pid に保存されます。

関連資料

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

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

前提条件
手順
  1. 可能であれば、対象のライブラリーおよび関数を特定します。
  2. 監視するプログラムが実行されていない場合には、ltrace を起動して、プログラム を指定します。

    $ ltrace -f -l library -e function program

    -e および -l のオプションを使用して、出力をフィルタリングします。

    • function として表示される関数の名前を指定します。-e function オプションは複数回使用できます。何も指定しない場合は、ltrace はすべての関数への呼び出しを表示します。
    • 関数を指定するのではなく、-l library オプションでライブラリー全体を指定することができます。このオプションは、-e function オプションと同じように動作します。

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

    プログラムがすでに実行中の場合は、プロセス id (pid) を検索して、その id に ltrace を割り当てます。

    $ ps -C program
    (...)
    $ ltrace ... -ppid

    フォークしたプロセスまたはスレッドを追跡しない場合には、-f オプションは指定しないでください。

  3. ltrace はアプリケーションのライブラリー呼び出しを表示します。

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

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

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

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

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

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

$ ltrace ... |& tee your_log_file.log
関連資料
  • strace(1) man ページ
  • Red Hat Developer Toolset User Guide: ltrace

20.3.4. SystemTap でのアプリケーションのシステム呼び出しの監視

SystemTap ツールでは、カーネルイベントにカスタムイベントハンドラーを登録できます。strace と比較すると、これは使いにくくなりますが、SystemTap はより効率的で、より複雑な処理ロジックを使用することができます。

前提条件
手順
  1. 以下の内容を含む my_script.stp ファイルを作成します。

    probe begin
    {
      printf("waiting for syscalls of process %d \n", target())
    }
    
    probe syscall.*
    {
      if (pid() == target())
        printf("%s(%s)\n", name, argstr)
    }
    
    probe process.end
    {
      if (pid() == target())
        exit()
    }
  2. 監視するプロセスのプロセス ID (pid) を検索します。

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

    # stap my_script.stp -x pid

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

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

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

20.3.5. GDB を使用したアプリケーションシステム呼び出しの遮断

GDB は、プログラムの実行中に発生するさまざまな状況において実行を停止することができます。プログラムがシステム呼び出しを実行する際に実行を停止するには、GDB catchpoint を使用します。

前提条件

GDB の使用によるシステム呼び出しでのプログラム実行の停止

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

    (gdb) catch syscall syscall-name

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

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

  2. プログラムが実行を開始していない場合は、これを開始します。

    (gdb) r

    プログラムの実行が一時停止しているだけの場合は、これを再開します。

    (gdb) c
  3. GDB は、指定のシステム呼び出しがプログラムによって実行された後に実行を一時停止します。
関連情報

20.3.6. アプリケーションによるシグナル処理を遮断するための GDB の使用

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

前提条件
GDB でのシグナル受信時のプログラム実行の停止
  1. キャッチポイントを設定します。

    (gdb) catch signal signal-type

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

  2. プログラムが実行を開始していない場合は、これを開始します。

    (gdb) r

    プログラムの実行が一時停止しているだけの場合は、これを再開します。

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

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.