5

エラーや例外をスローせず、アプリをクラッシュさせないJavaアプリケーションの問題をデバッグしようとしています(失敗は別のスレッドで発生しているようです)。

問題はライブラリ関数の呼び出しの中にあるようです(それJAXBContext.newInstance(String)が重要な場合です)。プログラムは呼び出しの直前に回線に到達しますが、直後の回線には到達しません。私のcatchブロックは入力されず、プログラムは実行を続けます。

この問題は、Struts経由で着信したWeb要求に対するXML応答をレンダリングしようとしているときに発生します。リクエストは処理され、コードはレスポンスオブジェクトをマーシャリングする必要があります。クライアントはすぐに応答を受け取りますが(コードがループでハングしているようには見えません)、空です。

問題のある行の直前にブレークポイントを設定しましたが、デバッガーがその行を実行するだけなので、理由がわかりません。

私はEclipseを使用しており、アプリケーションはで開始されたOSGiコンテナー(Apache Felix)内で実行され-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=yます。次に、Eclipse内から、「リモートJavaアプリケーション」のデバッグ設定を使用してデバッガーを接続します。

そのような問題に取り組むためのテクニックは何ですか?

4

4 に答える 4

6

当然の質問かもしれませんが、Throwable をキャッチしていると確信していますか? チェックされていない例外は、問題のスレッドを簡単に終了させる可能性があります (コール スタックであなたより上の誰もそれをキャッチしていないと仮定します)。

デバッグ引数を使用して起動時に VM を一時停止しているため、デバッガーが正しく接続されていることを確認したと思います。デバッガーが呼び出しをスキップするという事実は非常に疑わしいです。このアプリケーションでブレークポイントをヒットできますか? このクラスではどうですか?このスレではどうですか?

デバッガーなしで問題の行をどのように絞り込みましたか? ファイルへのprintln /デバッグ?

問題のメソッドのコード スニペットを貼り付けていただけますか?

問題が発生する前に 2 番目のスレッドを作成し、それを死にかけていると思われるスレッドに結合することで、スレッドが死にかけているという理論を確認できます。次に、問題のスレッドが終了したときに 2 番目のスレッドの run() メソッドが呼び出され、そのスレッドが終了したことがわかります (ただし、その理由はまだわかりません)。

あなたの一般的な質問への回答として、Java アプリにバグがあり、デバッガーで再現できない場合 (さまざまな理由で時々発生します)、sysout printlns を使用してコードを段階的に変更するか、ファイルに出力します。必要に応じて、コードが呼び出しているコードを変更することもあります。呼び出しているコードのソース コードがない場合は、多くの BCI フレームワークのいずれかを試して、問題のメソッドにバイト コードを挿入することができます。これは面倒なプロセスですが、たまにしか発生しません。

于 2009-07-16T17:48:28.930 に答える
2

スレッドダンプを取得してみることができます。これにより、ブロックしているメソッド(入力の待機など)があるかどうかがわかります。[編集:元の質問を読み直して、スレッドダンプを取得しても、実際には何もブロックされていないように見えるため、おそらく役に立たないでしょう。しかし、他の多くの状況で役立つと思うので、ここに残しておきます!]

エラーが別のスレッドで発生していると思われる場合は、UncaughtExceptionHandlerを設定してエラーをキャッチすることもできます。

于 2009-06-24T09:52:56.203 に答える
1

問題がそのメソッド内のどこかにあることが確実な場合は、JAXBソースコードを調べてみてください。

編集:

まあ、それが本当に悪くなった場合は、デバッグインストルメンテーションを使用して独自のプライベートコピーを作成できます。私はあなたがそれに頼る必要がないことを願っています。

于 2009-06-24T09:49:07.337 に答える
0

おそらく呼び出しの中で、無限のループが発生していて、これがそれ以上得られない理由です-しかし、これはクラッシュを引き起こさないかもしれません(各ループでメモリが使用されている場合を除く)。

于 2009-06-24T09:40:38.927 に答える