Eclipseデバッガーは、明らかな例外なしに常にThreadPoolExecutorをブロックしますが、なぜですか?


209

私はEclipseで通常のプロジェクトに取り組んでいます。これは、Spring、Hibernateなどで作成されたJ2EEアプリケーションです。私はこのためにTomcat 7を使用しています(特別な理由はありません。新機能を利用しないので、試してみたかっただけです)。アプリケーションをデバッグするたびに、Eclipseデバッガーがブレークポイントに到達したようにポップアップ表示されることがありますが、そうではありません。実際には、Javaソースファイルで停止しますThreadPoolExecutor。コンソールにスタックトレースはなく、停止するだけです。次に、[再開]をクリックすると、再開し、アプリは完全に機能します。これは、デバッガーウィンドウに表示されるものです。

Daemon Thread ["http-bio-8080"-exec-2] (Suspended (exception RuntimeException)) 
    ThreadPoolExecutor$Worker.run() line: 912   
    TaskThread(Thread).run() line: 619

まったく使っていないので、これは本当に説明できませんThreadPoolExecutor。Tomcat、Hibernate、Springのいずれかである必要があります。デバッグ中に常に再開しなければならないので、非常に迷惑です。

手がかりはありますか?


1
@ AmosM.CarpenterはJEEではなくJava EEではありませんか?あなた自身のリンクでさえ示唆しているようです
eis

回答:


290

ポストされたスタックトレースは、デーモンスレッドでRuntimeExceptionが発生したことを示しています。元の開発者が例外をキャッチして処理しない限り、これは通常、実行時に捕捉されません。

通常、Eclipseのデバッガーは、キャッチされなかっすべての例外について、例外がスローされた場所で実行を中断するように構成されています。例外は後で処理される場合があり、スタックフレームの下位に移動し、スレッドが終了しない場合があることに注意してください。これが、観察された動作の原因になります。

Eclipseの動作を構成するのは簡単です。[ ウィンドウ] > [ 設定] > [ Java ] > [ デバッグ]に
移動し、[ キャッチされなかった例外で実行を中断]をオフにします



5
これについては、Eclipse アプリケーションのバグ384073を提出しました。これにより、Webアプリのデバッグ時にこのオプションが実質的に使用できなくなります。
Daniel Serodio

9
Eclipseで「キャッチされていない例外の実行を中断する」を無効にするのは悪い回避策です。たとえば、独自のコードから発生したなど、キャッチされていない実際の例外でEclipseを中断させたい場合はどうでしょうか。これはTomcatのバグのようです...

3
@ルイス:私は同じことを考えました!あたりとしてbugs.eclipse.org/bugs/show_bug.cgi?id=384073#c4、1缶:無効グローバルブレークポイントは、java.lang.Exceptionを上に新しいブレークポイントを作成し、この新しく作成されたブレークポイントに対して排他的なフィルタを適用します。
rektide 2013年

3
@Daniel ... Tomcatチームに問題を報告した方がいいかもしれません。この動作はTomcat 7の新機能だと思います... Eclipseは想定されていることを実行します...(いつか私がEclipseを守ることになるとは思いもしませんでした... :)
Stijn de Witt

47

より具体的な解決策があります。これはRuntimeException、特定のクラスからのみスローされたでEclipseが壊れるのを防ぎます。

  1. 新しい例外ブレークポイントを追加するデバッグの観点から
  2. そのに行く プロパティにます
  3. に行く フィルタリングに
  4. 「選択した場所に制限」で、「クラスを追加」をクリックします
  5. 追加 java.util.concurrent.ThreadPoolExecutor
  6. チェックボックスをオフにします。つまり、これらは無視されます

1
Tomcat 7とEclipse / STS 3.4.0では動作しないようです。他に必要な設定はありますか?このブレークポイントを登録する必要がありますRuntimeExceptionか?有効または無効にする必要がありますか?「キャッチされた場所」と「キャッチされていない場所」はオンまたはオフにする必要がありますか?
Henrik Heimbuerger、2013

2
例外ブレークポイントはjava.lang.RuntimeExceptionである必要があり、有効化されている必要があり、キャッチされていない場所のみである必要があり、java.util.concurrent.ThreadPoolExecutorクラスがチェックされていない必要があります。
マリオ2014

残念ながら、Ubuntu 14.04では、Eclipse Luna 4.4.0の場合、「選択した場所に制限」を使用できません。
eeezyy 2014


2

これは、サーバーファイル(jspまたはjava)を変更した後に頻繁に発生し、STSがアプリケーションをリロードできないことに気づきました。

これは通常、変更を同期させるためにサーバーを再起動することになります。

JRebelの導入後-なくなったようです。したがって、デバッグモードでコードをホットスワップするときに、STSで再現可能な問題であると考えたいと思います。

ネイティブのホットスワップを削除することで、ThreadPoolExecutorクラスの内部で問題が発生する問題を排除します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.