コマンドまたはプロセスがハング、フリーズ、クラッシュなどのように見える場合。舞台裏で、現在何をしているのか(もしあれば)を正確に調査する方法はありますか?
クラッシュしたのか、それとも長いタスクを実行しているだけなのかを判断するのに特に役立ちます。また、期待どおりに動作しない場合は、トラブルシューティングに役立つ可能性があります。ありがとう。
これを行うために使用できる2つの低レベルツール、strace
とgdb
があります。 strace
が利用できるかどうかは、それが機能するLinuxまたはOSを使用していることを前提としています。他のOSの場合、truss
またはdtrace
があるかもしれませんが、テクニックは似ています。
したがって、strace
はgdb
よりも使いやすく、通常は「このアプリケーションは何をしているのか」という質問にうまく答えます。 (私にとって)典型的な使用法は次のようになります:
strace -f -tt -s 200 -p $PID
必要な唯一の実際のオプションは-p $PID
です。他のオプションは、出力行に情報を追加するだけですが、実際には必要ありません。
これは、アプリケーションが行っているすべてのシステムコールを表示します。アプリケーションが何かを実行できる唯一の方法であり、strace
がそれを表示しないのは、それが純粋に計算である場合です。クランチナンバーか何かを意味します。ファイルの読み取り/書き込み、パケットの送信、現在の時刻の取得などはすべてシステムコールを必要とし、表示されます。
gdb
はstrace
よりも下位レベルです。 gdb
は、アプリケーションが実際に実行しているコード行を示します。ただし、これにはいくつかの落とし穴があります。大きな問題は、アプリケーションのデバッグシンボルが必要なことです。ディストリビューションが提供するパッケージでは、これらは通常削除されています。ただし、RedHat派生ディストリビューションのようなディストリビューションでは、多くの場合、pkgfoo-debuginfo-1.2.3.rpm
の形式で提供されます。このパッケージをインストールして、シンボルを取り戻すことができます。もう1つのことは、strace
はアプリケーションが時間の経過とともに何をしているかを示し、gdb
はアプリケーションが検査中にプロセスをフリーズするため、その瞬間に何をしているかを示します。 。
とにかく、使用法は次のようになります。
gdb -p $PID
...次のようなものを実行できるインタラクティブなシェルに移動します。
where
または
info threads
アプリケーションの複雑さによっては複雑になる可能性があり、インターネット上にはたくさんのガイドがあるため、gdb
の使用方法の詳細については説明しません。
プロセスを突っついた後、再開させたい場合は、quit
または CTRL+D。
-v
フラグを追加することにより、詳細な出力を備えたターミナルウィンドウからほとんどのプロセスを開始できます。そうすれば、ターミナルウィンドウがハングしているように見えるときに、ターミナルウィンドウで何が起こっているかを確認できます。
top
とhtop
は、memとcpuの使用法に関する更新情報や、非常に役立つ要約情報など、実行中のプロセスに関する有用な情報を提供します。
ps
コマンドのドキュメントとman ps
もご覧ください。