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
でカーネルの関数を追跡する代わりに、ltrace
でglibc
など、ライブラリー内の各インターフェイスを追跡できます。 -
ltrace
は、strace
などの既知の呼び出しを処理しないため、ライブラリー関数に渡す値を記述することができません。ltrace
の出力には、生の数値およびポインターのみが含まれます。ltrace
の出力の解釈には、出力にあるライブラリーの実際のインターフェイス宣言を確認する必要があります。
注記Red Hat Enterprise Linux 8 では、既知の問題により、
ltrace
が実行ファイルを追跡できなくなります。この制限は、ユーザーが構築する実行ファイルには適用されません。-
- SystemTap
SystemTap は、Linux システム上で実行中のプロセスおよびカーネルアクティビティーを調査するための有用なインストルメンテーションプラットフォームです。SystemTap は、独自のスクリプト言語を使用してカスタムイベントハンドラーをプログラミングします。
-
strace
とltrace
の使用と比較した場合、ロギングのスクリプトを作成すると、初期の設定フェーズでより多くの作業が必要になります。ただし、スクリプト機能は単にログを生成するだけでなく、SystemTap の有用性を高めます。 - SystemTap は、カーネルモジュールを作成し、挿入すると機能します。SystemTap は効率的に使用でき、システムまたはアプリケーションの実行速度が大幅に低下することはありません。
- SystemTap には一連の使用例が提供されます。
-
- GDB
GNU デバッガー (GDB) は主に、ロギングではなく、デバッグを目的としています。ただし、その機能の一部は、アプリケーションの相互作用が重要な主要なアクティビティーであるシナリオでも有用です。
- GDB を使用すると、相互作用イベントを取得して、後続の実行パスの即時デバッグを簡単に組み合わせることができます。
- GDB は、他のツールで問題のある状況を最初に特定した後、まれなイベントまたは特異なイベントへの応答を分析するのに最適です。イベントが頻繁に発生するシナリオで GDB を使用すると、効率が悪くなったり、不可能になったりします。
3.3.2. strace でアプリケーションのシステムコールの監視
strace
ツールは、アプリケーションを実行するシステム (カーネル) コールの監視を有効にします。
手順
- 監視するシステムコールを特定します。
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
オプションを指定しないでください。
strace
は、アプリケーションで作成したシステムコールとその詳細を表示します。ほとんどの場合、システムコールのフィルターが設定されていないと、アプリケーションとそのライブラリーは多数の呼び出しを行い、
strace
出力がすぐに表示されます。strace
ツールは、プログラムの終了時に、終了します。追跡しているプログラムの終了前に監視を中断するには、Ctrl+C を押します。
-
strace
でプログラムを起動すると、そのプログラムはstrace
とともに中断します。 -
実行中のプログラムに
strace
を割り当てると、そのプログラムはstrace
とともに中断します。
-
アプリケーションが実行したシステム呼び出しのリストを分析します。
- リソースへのアクセスや可用性の問題は、エラーを返す呼び出しとしてログに表示されます。
- システムコールに渡される値とコールシーケンスのパターンは、アプリケーションの動作の原因に関する洞察を提供します。
- アプリケーションがクラッシュした場合、重要な情報はおそらくログの最後にあります。
- 出力には不要な情報が多く含まれています。ただし、目的のシステムコールに対してより正確なフィルターを作成し、この手順を繰り返すことができます。
出力を確認することにも、ファイルに保存することにも利点があります。これを行うには、tee
コマンドを使用します。
$ strace ... |& tee your_log_file.log
関連情報
man ページの strace(1):
$ man strace
- ナレッジベースアーティクル - strace を使用して、コマンドが実行したシステムコールを追跡する
- Red Hat Developer Toolset ユーザーガイドの strace の章
3.3.3. ltrace でアプリケーションのライブラリー関数呼び出しの監視
ltrace
ツールは、ライブラリー (共有オブジェクト) で利用可能な関数へのアプリケーションの呼び出しを監視できます。
Red Hat Enterprise Linux 8 では、既知の問題により、ltrace
が実行ファイルを追跡できなくなります。この制限は、ユーザーが構築する実行ファイルには適用されません。
手順
- 可能であれば、対象のライブラリーおよび関数を特定します。
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) を参照してください。
-
function として表示される関数の名前を指定します。
ltrace
は、アプリケーションにより作成されたライブラリーコールを表示します。多くの場合は、フィルターが設定されていないと、アプリケーションは多数の呼び出しを作成し、
ltrace
の出力がすぐに表示されます。ltrace
は、プログラムが終了すると終了します。追跡しているプログラムの終了前に監視を中断するには、ctrl+C を押します。
-
ltrace
でプログラムを起動した場合には、プログラムはltrace
と共に中断します。 -
実行中のプログラムに
ltrace
を割り当てると、プログラムはltrace
と共に終了します。
-
アプリケーションが実行したライブラリーコールのリストを分析します。
- アプリケーションがクラッシュした場合、重要な情報はおそらくログの最後にあります。
- 出力には不要な情報が多く含まれています。ただし、より正確なフィルターを作成して、手順を繰り返すことができます。
出力を確認することにも、ファイルに保存することにも利点があります。これを行うには、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
に類似の機能を提供します。
手順
監視するプロセスのプロセス ID (pid) を検索します。
$ ps -aux
strace.stp
スクリプトで SystemTap を実行します。# stap /usr/share/systemtap/examples/process/strace.stp -x pid
pid の値は、プロセス ID です。
スクリプトはカーネルモジュールにコンパイルされ、それが読み込まれます。これにより、コマンドの入力から出力の取得までにわずかな遅延が生じます。
- プロセスでシステム呼び出しが実行されると、呼び出し名とパラメーターがターミナルに出力されます。
-
プロセスが終了した場合、または
Ctrl+C
を押すと、スクリプトは終了します。
3.3.5. GDB を使用したアプリケーションのシステムコールの傍受
GNU デバッガー (GDB) により、プログラムの実行中に発生するさまざまな状況で実行を停止できます。プログラムがシステムコールを実行するときに実行を停止するには、GDB の チェックポイント を使用します。
手順
キャッチポイントを設定します。
(gdb) catch syscall syscall-name
catch syscall
コマンドは、プログラムがシステムコールを実行する際に実行を停止する特別なブレークポイントを設定します。syscall-name
オプションは、コールの名前を指定します。様々なシステム呼び出しに対して複数のキャッチポイントを指定することができます。syscall-name
オプションを指定しないと、システムコールで GDB が停止します。プログラムの実行を開始します。
プログラムにより、実行が開始していない場合は開始します。
(gdb) r
プログラムの実行が停止した場合は、再開します。
(gdb) c
- GDB は、プログラムが指定のシステムコールを実行した後に実行を停止します。
関連情報
- 「GDB でのプログラム内部値の表示」
- 「GDB を使用したプログラムコードのステップ実行」
- GDB を使用したデバッグ - Setting Watchpoints
3.3.6. GDB を使用したアプリケーションによるシグナル処理のインターセプト
GNU デバッガー (GDB) により、プログラムの実行中に発生するさまざまな状況で実行を停止できます。プログラムがオペレーティングシステムからシグナルを受信するときに実行を停止するには、GDB の キャッチポイント を使用します。
手順
キャッチポイントを設定します。
(gdb) catch signal signal-type
catch signal
コマンドは、プログラムがシステムコールを受けたときに実行を停止する特別なブレークポイントを設定します。signal-type
オプションは、シグナルのタイプを指定します。すべてのシグナルを取得するには、特別な値all
を使用します。プログラムを実行します。
プログラムにより、実行が開始していない場合は開始します。
(gdb) r
プログラムの実行が停止した場合は、再開します。
(gdb) c
- GDB は、プログラムが指定のシグナルを受けると実行を停止します。
関連情報
- 「GDB でのプログラム内部値の表示」
- GDB を使用したプログラムコードのステップ実行
- GDB を使用したデバッグ - 5.1.3 Setting Catchpoints