1

私の問題は実際の実践から来ています。外部(ネットワーク)サービスに依存するアプリケーションがあります。一部のサービスにアクセスできなくなると、アプリケーションがフリーズし、問題の原因がわかりません。

私は自分でアプリケーションを作成せず、問題が発生した場合にソースコードでロギングを使用しません。

jconsoleを実行すると、トレースを含むすべてのスレッドが表示されます(Windowsネイティブアプリケーションの以前のジョブでprocexpを使用してこれを行うように)。しかし、120のスレッドがあります!!

そこで、トレース内のいくつかのクラス(またはパッケージ/クラスの正規表現パターン)でスレッドを見つけて、そのトレースを出力したいと思います。だから私はネットワーク待機が行われる場所を見つけます。

jconsoleアプリケーションは、これが理論的に可能であることを示しました(ただし、パッケージを目で検索するjconsoleインターフェイスの120スレッドすべてをクリックしたくありません)。

完全なデバッガーjdbを実行する必要がありますか?そのような情報を取得できるようにするために、アプリ(実際にはJBossアプリケーションサーバーのSpringアプリケーション)を起動する必要がありますか?

私は古いライブEmacsユーザーなので、コマンドラインユーティリティでローカルに実行されているアプリケーションの痕跡を含むすべてのスレッドをダンプすることでも問題は解決します。

これは不要のように思われるので、通常(デバッグ調整なしで)実行中のアプリケーションへの接続を好みます。

4

1 に答える 1

1

jvisualvmを実行して[スレッド]タブにアクセスし、[スレッドダンプ]ボタンを押して、質問された情報を取得します。

だから私はレポートをファイルに保存し、正規表現を使ってEmacsで検索を実行することができます。

jconsole が(低レベルのCの世界から)Javaの世界に戻ったばかりとして非推奨になったことを忘れています。

しかし、自由に記入して、非対話型のコマンドラインソリューションを教えてください...

UPDATE kill -QUIT $pidは、Javaプロセスを作成してスレッドトレースをstdoutにダンプします。jps -lJavaプロセスを見つけるのに役立ちます。stdinが再定義された場合(Tomcat ASなど)-ASログを確認してください!

于 2012-11-29T06:51:40.473 に答える