web-dev-qa-db-ja.com

問題のあるプロセスの調査

コマンドまたはプロセスがハング、フリーズ、クラッシュなどのように見える場合。舞台裏で、現在何をしているのか(もしあれば)を正確に調査する方法はありますか?

クラッシュしたのか、それとも長いタスクを実行しているだけなのかを判断するのに特に役立ちます。また、期待どおりに動作しない場合は、トラブルシューティングに役立つ可能性があります。ありがとう。

1
tjt263

これを行うために使用できる2つの低レベルツール、stracegdbがあります。 straceが利用できるかどうかは、それが機能するLinuxまたはOSを使用していることを前提としています。他のOSの場合、trussまたはdtraceがあるかもしれませんが、テクニックは似ています。

strace

したがって、stracegdbよりも使いやすく、通常は「このアプリケーションは何をしているのか」という質問にうまく答えます。 (私にとって)典型的な使用法は次のようになります:

strace -f -tt -s 200 -p $PID

必要な唯一の実際のオプションは-p $PIDです。他のオプションは、出力行に情報を追加するだけですが、実際には必要ありません。

これは、アプリケーションが行っているすべてのシステムコールを表示します。アプリケーションが何かを実行できる唯一の方法であり、straceがそれを表示しないのは、それが純粋に計算である場合です。クランチナンバーか何かを意味します。ファイルの読み取り/書き込み、パケットの送信、現在の時刻の取得などはすべてシステムコールを必要とし、表示されます。

gdb

gdbstraceよりも下位レベルです。 gdbは、アプリケーションが実際に実行しているコード行を示します。ただし、これにはいくつかの落とし穴があります。大きな問題は、アプリケーションのデバッグシンボルが必要なことです。ディストリビューションが提供するパッケージでは、これらは通常削除されています。ただし、RedHat派生ディストリビューションのようなディストリビューションでは、多くの場合、pkgfoo-debuginfo-1.2.3.rpmの形式で提供されます。このパッケージをインストールして、シンボルを取り戻すことができます。もう1つのことは、straceはアプリケーションが時間の経過とともに何をしているかを示し、gdbはアプリケーションが検査中にプロセスをフリーズするため、その瞬間に何をしているかを示します。 。

とにかく、使用法は次のようになります。

gdb -p $PID

...次のようなものを実行できるインタラクティブなシェルに移動します。

where

または

info threads

アプリケーションの複雑さによっては複雑になる可能性があり、インターネット上にはたくさんのガイドがあるため、gdbの使用方法の詳細については説明しません。

プロセスを突っついた後、再開させたい場合は、quitまたは CTRL+D

3
Patrick

-vフラグを追加することにより、詳細な出力を備えたターミナルウィンドウからほとんどのプロセスを開始できます。そうすれば、ターミナルウィンドウがハングしているように見えるときに、ターミナルウィンドウで何が起こっているかを確認できます。

tophtopは、memとcpuの使用法に関する更新情報や、非常に役立つ要約情報など、実行中のプロセスに関する有用な情報を提供します。

psコマンドのドキュメントとman psもご覧ください。

0
Alxs