この記事では、 strace を使用して、Linux 環境でアプリケーションの問題を診断し、解決する方法を説明します。この強力なツールは、システム コールに関する詳細な洞察を提供し、開発者、システム管理者、サポート エンジニアがパフォーマンスのボトルネック、クラッシュ、ネットワークの問題を効果的にトラブルシューティングするのに役立ちます。
strace とは何ですか?
strace は、Linux 用の診断、デバッグ、教育用ユーティリティです。実行中のプロセスが行ったシステム コールと、プロセスが受信したシグナルを傍受して記録します。この情報を取得することで、 strace は、ソフトウェアがオペレーティング システムとどのようにやり取りするかについての貴重な洞察を提供し、次の用途に欠かせないツールとなっています:
- アプリケーションのクラッシュのデバッグ
- 不足しているファイルや権限の問題の特定
- ネットワークの問題の診断
- パフォーマンスのボトルネックの最適化
strace を使用する理由
プログラムがシステムとどのようにやり取りするかを理解することは、問題を診断するうえで重要です。 strace は、システム コールに関する詳細な洞察を提供します。たとえば:
- ファイル操作
- ネットワーク通信
- プロセス管理
この情報は、障害、速度低下、予期しない動作を特定するのに役立ち、問題をより迅速に解決できるようになります。
strace の使い方
strace の使用は簡単です。基本的な構文は次のとおりです:
strace [options] command [arguments]
例:
次の ls コマンドをトレースするには:
strace ls
これは、 lsが行ったシステム コールのリストを出力し、その動作を理解するのに役立ちます。
主なオプションとフラグ
一般的に使用される strace オプションを次に示します:
-o filename:トレース出力をファイルに書き込みます。
例:strace -o trace_output.txt ls-p pid:指定された PID を持つプロセスにアタッチし、トレースを開始します。
例:strace -p 1234-e trace=set:トレースするシステム コールの種類をフィルタリングします。
例:strace -e trace=open,close ls-r:連続するシステム コール間の経過時間を表示します。
例:strace -r ls-T:各システム コールに費やされた時間を表示します。
例:strace -T ls
一般的なパラメーターの説明
一般的に使用される strace パラメーターについて、以下で詳しく説明します:
1. -r (相対時間)
- 目的:連続するシステム コール間の経過時間を測定して表示します。
- ユース ケース:プログラムの実行における遅延やボトルネックの特定に役立ちます。
- 例:
strace -r ls出力には、各システム コール間の経過時間が含まれ、パフォーマンスの問題を分析できるようになります。
2. -e (イベント フィルタリング)
- 目的:トレースするシステム コールやシグナルの種類をフィルタリングし、出力の量を減らして特定のイベントに焦点を当てます。
- ユース ケース:
-eを使用すると、関連するシステム コールのみをトレースでき、出力を分析しやすくなります。 - 例:
strace -e trace=open,read,write ls出力には、ファイルを開く、読み取る、書き込むことに関連するシステム コールのみが表示されます。
3. -o (ファイルへの出力)
- 目的:トレース出力をターミナルに表示する代わりに、ファイルに保存します。
- ユース ケース:大量の出力を分析したり、デバッグ情報を他の人と共有したりするのに役立ちます。
- 例:
strace -o trace_output.txt ls
4. -p (PID によるプロセスへのアタッチ)
- 目的:
straceを、PID で識別される実行中のプロセスにアタッチします。 - ユース ケース:実行中のアプリケーションを再起動せずにデバッグしたい場合に使用します。
- 例:
strace -p 1234
5. -T (タイミング情報)
- 目的:各システム コールに費やされた時間を表示します。
- ユース ケース:時間がかかりすぎて最適化が必要な可能性のあるシステム コールの特定に役立ちます。
- 例:
strace -T ls
6. -c (概要統計)
- 目的:トレースの最後に、呼び出し回数、費やされた時間、エラーを含むシステム コールの概要を出力します。
- ユース ケース:出力全体を分析することなく、システム コールの使用状況の概要を把握するのに最適です。
- 例:
strace -c ls
7. -s (文字列サイズ)
- 目的:出力に表示する文字列の最大サイズを指定します。既定では、
straceは 32 文字を超える文字列を切り捨てます。 - ユース ケース:システム コールに大きな文字列を渡すアプリケーションをデバッグするときに使用します。
- 例:
strace -s 128 ls出力には、最大 128 文字の文字列が含まれます。
8. -f (フォークの追跡)
- 目的:
fork()またはclone()によって作成された子プロセスをトレースします。 - ユース ケース:マルチプロセス アプリケーションや、子プロセスを生成するプログラムのデバッグに役立ちます。
- 例:
strace -f ls
strace の実践的な使い方
1. アプリケーションのクラッシュのデバッグ
アプリケーションがクラッシュした場合は、 strace を使用して、クラッシュの前に行われた最後のシステム コールを特定します。
例:
strace -o crash_trace.txt ./my_app
次のファイルの出力を調べ、 crash_trace.txt で、クラッシュの原因を特定します。
2. 不足しているファイルや権限の問題の特定
プログラムがファイルを開けなかったり、権限の問題に遭遇したりした場合、 strace が問題の特定に役立ちます。
例:
strace -e trace=open ./my_app
出力の中で、次のようなエラーを探します ENOENT (ファイルが見つかりません) または EACCES (権限が拒否されました) などです。
3. ネットワークのトラブルシューティング
ネットワークの問題を診断するには、ネットワークに関連するシステム コールをトレースします。
例:
strace -e trace=network curl http://example.com
これにより、DNS 解決、接続性、プロトコル エラーの問題が明らかになる場合があります。
4. パフォーマンス チューニング
strace を使用して、遅いシステム コールや最適化できる可能性のある頻繁な呼び出しを特定することで、パフォーマンスのボトルネックを見つけます。
例:
strace -T -o perf_trace.txt ./my_app
-T フラグは、各システム コールにタイミング情報を追加し、遅延の特定に役立ちます。
strace を使用するためのベスト プラクティス
- トレースの範囲を制限する:フィルタリング オプションを使用して、取得するデータを減らし、分析を容易にします。
- 本番環境以外で使用する:
straceはリソースを大量に消費する可能性があるため、開発環境やステージング環境で使用するのが最適です。 - 他のツールと組み合わせる:
straceを他のデバッグ ツールと組み合わせることで、より包括的な分析が可能になります。
まとめ
strace は、Linux におけるトラブルシューティングとデバッグのための多用途で強力なツールです。システム コールの詳細なビューを提供することで、アプリケーションの問題の根本原因を明らかにし、より効果的な問題解決とシステムの最適化につなげます。