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を割り当てます。プロセス ID を検索します。
$ ps -C program(...)プロセスに strace をアタッチします。
$ strace -fvttTyy -s 256 -e trace=call -ppid
-
call を、表示するシステムコールに置き換えます。
-e trace=callオプションを複数回使用できます。何も指定しない場合、straceはすべてのシステムコールタイプを表示します。詳細は、man ページの strace(1) を参照してください。 -
フォークしたプロセスまたはスレッドを追跡しない場合は、
-fオプションを指定しないでください。
straceは、アプリケーションで作成したシステムコールとその詳細を表示します。ほとんどの場合、システムコールのフィルターが設定されていないと、アプリケーションとそのライブラリーは多数の呼び出しを行い、
strace出力がすぐに表示されます。straceツールは、プログラムの終了時に、終了します。追跡しているプログラムの終了前に監視を中断するには、 を押します。
-
straceでプログラムを起動すると、そのプログラムはstraceとともに中断します。 -
実行中のプログラムに
straceを割り当てると、そのプログラムはstraceとともに中断します。
-
アプリケーションが実行したシステム呼び出しのリストを分析します。
- リソースへのアクセスや可用性の問題は、エラーを返す呼び出しとしてログに表示されます。
- システムコールに渡される値とコールシーケンスのパターンは、アプリケーションの動作の原因に関する洞察を提供します。
- アプリケーションがクラッシュした場合、重要な情報はおそらくログの最後にあります。
- 出力には不要な情報が多く含まれています。ただし、目的のシステムコールに対してより正確なフィルターを作成し、この手順を繰り返すことができます。
出力を確認することにも、ファイルに保存することにも利点があります。これを行うには、tee コマンドを使用します。
$ strace ... |& tee your_log_file.log
3.3.3. ltrace でアプリケーションのライブラリー関数呼び出しの監視 リンクのコピーリンクがクリップボードにコピーされました!
ltrace ツールは、ライブラリー (共有オブジェクト) で利用可能な関数へのアプリケーションの呼び出しを監視できます。
Red Hat Enterprise Linux 8 では、既知の問題により、ltrace が実行ファイルを追跡できなくなります。この制限は、ユーザーが構築する実行ファイルには適用されません。
手順
- 可能であれば、対象のライブラリーおよび関数を特定します。
ltraceを起動し、プログラムに割り当てます。監視するプログラムが実行していない場合は、
ltraceを起動して、プログラム を指定します。$ ltrace -f -l library -e function program-
プログラムがすでに実行中の場合は、プロセス id (pid) を検索して、その id に
ltraceを割り当てます。
プロセス ID を検索します。
$ ps -C program(...)プロセスに ltrace をアタッチします。
$ 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は、プログラムが終了すると終了します。追跡しているプログラムの終了前に監視を中断するには、 を押します。
-
ltraceでプログラムを起動した場合には、プログラムはltraceと共に中断します。 -
実行中のプログラムに
ltraceを割り当てると、プログラムはltraceと共に終了します。
-
アプリケーションが実行したライブラリーコールのリストを分析します。
- アプリケーションがクラッシュした場合、重要な情報はおそらくログの最後にあります。
- 出力には不要な情報が多く含まれています。ただし、より正確なフィルターを作成して、手順を繰り返すことができます。
出力を確認することにも、ファイルに保存することにも利点があります。これを行うには、tee コマンドを使用します。
$ ltrace ... |& tee your_log_file.log
3.3.4. SystemTap を使用したアプリケーションのシステムコールの監視 リンクのコピーリンクがクリップボードにコピーされました!
SystemTap ツールでは、カーネルイベントにカスタムイベントハンドラーを登録できます。strace ツールと比較すると、使用は難しくなりますが、より効率的でより複雑な処理ロジックを使用できます。strace.stp と呼ばれる SystemTap スクリプトは SystemTap と共にインストールされ、SystemTap を使用して strace に類似の機能を提供します。
手順
監視するプロセスのプロセス ID (pid) を検索します。
$ ps -auxstrace.stpスクリプトで SystemTap を実行します。# stap /usr/share/systemtap/examples/process/strace.stp -x pidpid の値は、プロセス ID です。
スクリプトはカーネルモジュールにコンパイルされ、それが読み込まれます。これにより、コマンドの入力から出力の取得までにわずかな遅延が生じます。
- プロセスでシステム呼び出しが実行されると、呼び出し名とパラメーターがターミナルに出力されます。
-
プロセスが終了した場合、または
Ctrl+Cを押すと、スクリプトは終了します。
3.3.5. GDB を使用したアプリケーションのシステムコールの傍受 リンクのコピーリンクがクリップボードにコピーされました!
GNU デバッガー (GDB) により、プログラムの実行中に発生するさまざまな状況で実行を停止できます。プログラムがシステムコールを実行するときに実行を停止するには、GDB の チェックポイント を使用します。
手順
キャッチポイントを設定します。
(gdb) catch syscall syscall-namecatch syscallコマンドは、プログラムがシステムコールを実行する際に実行を停止する特別なブレークポイントを設定します。syscall-nameオプションは、コールの名前を指定します。様々なシステム呼び出しに対して複数のキャッチポイントを指定することができます。syscall-nameオプションを指定しないと、システムコールで GDB が停止します。プログラムの実行を開始します。
プログラムにより、実行が開始していない場合は開始します。
(gdb) rプログラムの実行が停止した場合は、再開します。
(gdb) c
- GDB は、プログラムが指定のシステムコールを実行した後に実行を停止します。
関連情報
- 「GDB でのプログラム内部値の表示」
- 「GDB を使用したプログラムコードのステップ実行」
- GDB によるデバッグ - ウォッチポイントの設定
3.3.6. GDB を使用したアプリケーションによるシグナル処理のインターセプト リンクのコピーリンクがクリップボードにコピーされました!
GNU デバッガー (GDB) により、プログラムの実行中に発生するさまざまな状況で実行を停止できます。プログラムがオペレーティングシステムからシグナルを受信するときに実行を停止するには、GDB の キャッチポイント を使用します。
手順
キャッチポイントを設定します。
(gdb) catch signal signal-typecatch signalコマンドは、プログラムがシステムコールを受けたときに実行を停止する特別なブレークポイントを設定します。signal-typeオプションは、シグナルのタイプを指定します。すべてのシグナルを取得するには、特別な値'all'を使用します。プログラムを実行します。
プログラムにより、実行が開始していない場合は開始します。
(gdb) rプログラムの実行が停止した場合は、再開します。
(gdb) c
- GDB は、プログラムが指定のシグナルを受けると実行を停止します。