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でカーネル関数を追跡する代わりに、ltraceでglibcなどのライブラリー内の各インターフェイスを追跡できます。ただし、システムコールのトレースでltraceは strace より正確性に欠ける点に注意してください。 -
ltraceは、制限されたライブラリー呼び出しセットのみにパラメーターをデコードできます。プロトタイプが、関連する設定ファイルで定義されている呼び出しです。ltraceパッケージの一部として、一部のlibacl、libc、およびlibm呼び出しおよびシステムコールのプロトタイプが提供されます。ltraceの出力には多くの場合、生の数値およびポインターのみが含まれます。ltraceの出力の解釈には通常、出力にあるライブラリーの実際のインターフェイス宣言を確認する必要があります。
-
- SystemTap
SystemTap は、Linux システム上で実行中のプロセスおよびカーネルアクティビティーを調査するための有用なインストルメンテーションプラットフォームです。SystemTap は、独自のスクリプト言語を使用してカスタムイベントハンドラーをプログラミングします。
-
straceとltraceの使用と比較した場合、ロギングのスクリプトを作成すると、初期の設定フェーズでより多くの作業が必要になります。ただし、スクリプト機能は単にログを生成するだけでなく、SystemTap の有用性を高めます。 - SystemTap は、カーネルモジュールを作成し、挿入すると機能します。SystemTap は効率的に使用でき、システムまたはアプリケーションの実行速度が大幅に低下することはありません。
- SystemTap には一連の使用例が提供されます。
-
- GDB
GNU デバッガーは主に、ロギングではなく、デバッグを目的としています。ただし、その機能の一部は、アプリケーションの対話が主要なアクティビティーとなるシナリオでも役に立ちます。
- GDB では、対話イベントを取得して、後に続く実行パスを即時にデバッグするように、都合よく組み合わせることができます。
- GDB は、他のツールで問題のある状況を最初に特定した後、頻度の低いイベントや特異なイベントへの応答を分析するのに最適です。イベントが頻繁に発生するシナリオで GDB を使用すると、効率が悪くなったり、不可能になったりします。
関連資料
20.3.2. strace でのアプリケーションのシステム呼び出しの監視 リンクのコピーリンクがクリップボードにコピーされました!
strace ツールは、システムコール、シグナル配信、プロセス状態の変更など、アプリケーションと Linux カーネル間の対話 (および改ざん) のトレースを有効にします。
前提条件
straceがシステムにインストールされているstraceをインストールするには、root で以下のコマンドを実行します。yum install strace
# yum install straceCopy to Clipboard Copied! Toggle word wrap Toggle overflow
手順
strace の追跡仕様構文は、システムコールの特定に役立つ正規表現と syscall クラスを提供することに注意してください。
監視するプロセスを実行またはアタッチします。
監視するプログラムが実行していない場合は、
straceを起動して、プログラム を指定します。strace -fvttTyy -s 256 -e trace=call program
$ strace -fvttTyy -s 256 -e trace=call programCopy to Clipboard Copied! Toggle word wrap Toggle overflow 上記の例で使用されるオプションは必須ではありません。必要な場合に使用します。
-
-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
$ ps -C program (...) $ strace -fvttTyy -s 256 -e trace=call -ppidCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
フォークしたプロセスまたはスレッドを追跡しない場合には、
-fオプションを使用しないでください。
straceは、アプリケーションで作成したシステム呼び出しとその詳細を表示します。ほとんどの場合、システム呼び出しのフィルターが設定されていないと、アプリケーションとそのライブラリーは多数の呼び出しを行い、
strace出力がすぐに表示されます。straceは、トレースしたプロセスがすべて終了する際に終了します。追跡しているプログラムの終了前に監視を中断するには、 を押します。-
straceがプログラムを起動すると、終了するシグナル (この場合は SIGINT) を起動しているプログラムに送信します。ただし、そのプログラムは、そのシグナルを無視する可能性があることに注意してください。 -
実行中のプログラムに
straceを割り当てると、そのプログラムはstraceと共に中断します。
-
アプリケーションが実行したシステム呼び出しのリストを分析します。
- リソースへのアクセスや可用性の問題は、エラーを返す呼び出しとしてログに表示されます。
- システム呼び出しや呼び出しシーケンスのパターンに渡す値により、アプリケーションの動作の原因が分かります。
- アプリケーションがクラッシュした場合に、重要な情報はおそらく、ログの最後に表示されます。
- 出力には多くの追加情報が含まれています。ただし、より正確なフィルターを作成して、手順を繰り返すことができます。
備考
出力を確認することにも、ファイルに保存することにも利点があります。これを行うには
teeコマンドを実行します。strace ...-o |tee your_log_file.log>&2
$ strace ...-o |tee your_log_file.log>&2Copy to Clipboard Copied! Toggle word wrap Toggle overflow 異なるプロセスに対応する個別の出力を表示するには、以下を実行します。
strace ... -ff -o your_log_file
$ strace ... -ff -o your_log_fileCopy to Clipboard Copied! Toggle word wrap Toggle overflow プロセス ID (pid) のプロセスの出力は、_log_file.pid に保存されます。
関連資料
- strace(1) man ページ
- ナレッジベースアーティクル: strace を使用して、コマンドが実行したシステムコールを追跡する
- Red Hat Developer Toolset User Guide: strace
20.3.3. ltrace でのアプリケーションのライブラリー関数呼び出しの監視 リンクのコピーリンクがクリップボードにコピーされました!
ltrace ツールは、ライブラリー (共有オブジェクト) で利用可能な関数に対するアプリケーションの呼び出しを監視できます。
前提条件
手順
- 可能であれば、対象のライブラリーおよび関数を特定します。
監視するプログラムが実行されていない場合には、
ltraceを起動して、プログラム を指定します。ltrace -f -l library -e function program
$ ltrace -f -l library -e function programCopy to Clipboard Copied! Toggle word wrap Toggle overflow -eおよび-lのオプションを使用して、出力をフィルタリングします。-
function として表示される関数の名前を指定します。
-e functionオプションは複数回使用できます。何も指定しない場合は、ltraceはすべての関数への呼び出しを表示します。 -
関数を指定するのではなく、
-l libraryオプションでライブラリー全体を指定することができます。このオプションは、-e functionオプションと同じように動作します。
詳細情報は、man ページの ltrace(1) を参照してください。
プログラムがすでに実行中の場合は、プロセス id (pid) を検索して、その id に
ltraceを割り当てます。ps -C program ltrace ... -ppid
$ ps -C program (...) $ ltrace ... -ppidCopy to Clipboard Copied! Toggle word wrap Toggle overflow フォークしたプロセスまたはスレッドを追跡しない場合には、
-fオプションは指定しないでください。-
function として表示される関数の名前を指定します。
ltraceはアプリケーションのライブラリー呼び出しを表示します。多くの場合、アプリケーションは大量の呼び出しを作成し、フィルターが設定されていない場合には、
ltraceの出力がすぐに表示されます。ltraceは、プログラムが終了すると終了します。追跡しているプログラムの終了前に監視を中断するには、 を押します。
-
ltraceでプログラムを起動した場合には、プログラムはltraceと共に中断します。 -
実行中のプログラムに
ltraceを割り当てると、プログラムはltraceと共に終了します。
-
アプリケーションが実行したライブラリー呼び出しのリストを分析します。
- アプリケーションがクラッシュした場合に、重要な情報はおそらく、ログの最後に表示されます。
- 出力には不要な情報が多く含まれています。ただし、より正確なフィルターを作成して、手順を繰り返すことができます。
出力を確認することにも、ファイルに保存することにも利点があります。これを実行するには、tee コマンドを使用します。
ltrace ... |& tee your_log_file.log
$ ltrace ... |& tee your_log_file.log
関連資料
- strace(1) man ページ
- Red Hat Developer Toolset User Guide: ltrace
20.3.4. SystemTap でのアプリケーションのシステム呼び出しの監視 リンクのコピーリンクがクリップボードにコピーされました!
SystemTap ツールでは、カーネルイベントにカスタムイベントハンドラーを登録できます。strace と比較すると、これは使いにくくなりますが、SystemTap はより効率的で、より複雑な処理ロジックを使用することができます。
前提条件
手順
以下の内容を含む
my_script.stpファイルを作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 監視するプロセスのプロセス ID (pid) を検索します。
ps -aux
$ ps -auxCopy to Clipboard Copied! Toggle word wrap Toggle overflow スクリプトで SystemTap を実行します。
stap my_script.stp -x pid
# stap my_script.stp -x pidCopy to Clipboard Copied! Toggle word wrap Toggle overflow pid の値は、プロセス ID です。
スクリプトはカーネルモジュールにコンパイルされ、それが読み込まれます。これにより、コマンドの入力から出力の取得までにわずかな遅延が生じます。
- プロセスでシステム呼び出しが実行されると、呼び出し名とパラメーターがターミナルに出力されます。
-
プロセスが終了した場合、または
Ctrl+Cを押すと、スクリプトは終了します。
関連資料
- SystemTap ビギナーズガイド
- SystemTap タップセットリファレンス
strace 機能に近い SystemTap スクリプトは、
/usr/share/systemtap/examples/process/strace.stpで利用できます。スクリプトを実行するには、以下を実行します。# stap --example strace.stp -x pidあるいは、以下のような場合もあります。
# stap --example strace.stp -c "cmd args …"
20.3.5. GDB を使用したアプリケーションシステム呼び出しの遮断 リンクのコピーリンクがクリップボードにコピーされました!
GDB は、プログラムの実行中に発生するさまざまな状況において実行を停止することができます。プログラムがシステム呼び出しを実行する際に実行を停止するには、GDB catchpoint を使用します。
前提条件
GDB の使用によるシステム呼び出しでのプログラム実行の停止
キャッチポイントを設定します。
(gdb) catch syscall syscall-name
(gdb) catch syscall syscall-nameCopy to Clipboard Copied! Toggle word wrap Toggle overflow catch syscallコマンドは、プログラムがシステム呼び出しを実行する際に実行を停止する特殊なタイプのブレークポイントを設定します。syscall-nameオプショは、呼び出し名を指定します。様々なシステム呼び出しに対して複数のキャッチポイントを指定することができます。syscall-nameオプションに何も指定しない場合には、システム呼び出しがあると GDB が停止してしまいます。プログラムが実行を開始していない場合は、これを開始します。
(gdb) r
(gdb) rCopy to Clipboard Copied! Toggle word wrap Toggle overflow プログラムの実行が一時停止しているだけの場合は、これを再開します。
(gdb) c
(gdb) cCopy to Clipboard Copied! Toggle word wrap Toggle overflow - GDB は、指定のシステム呼び出しがプログラムによって実行された後に実行を一時停止します。
関連情報
20.3.6. アプリケーションによるシグナル処理を遮断するための GDB の使用 リンクのコピーリンクがクリップボードにコピーされました!
GDB は、プログラムの実行中に発生するさまざまな状況において実行を停止することができます。プログラムがオペレーティングシステムからシグナルを受信した時に実行を停止するには、GDB の キャッチポイント を使用します。
前提条件
GDB でのシグナル受信時のプログラム実行の停止
キャッチポイントを設定します。
(gdb) catch signal signal-type
(gdb) catch signal signal-typeCopy to Clipboard Copied! Toggle word wrap Toggle overflow catch signalコマンドは、プログラムがシステムコールを受けたときに実行を停止する特別なブレークポイントを設定します。signal-typeオプションは、シグナルのタイプを指定します。すべてのシグナルを取得するには、特別な値'all'を使用します。プログラムが実行を開始していない場合は、これを開始します。
(gdb) r
(gdb) rCopy to Clipboard Copied! Toggle word wrap Toggle overflow プログラムの実行が一時停止しているだけの場合は、これを再開します。
(gdb) c
(gdb) cCopy to Clipboard Copied! Toggle word wrap Toggle overflow - GDB は、プログラムが指定のシグナルを受けると実行を停止します。