Eclipse hata ayıklayıcı her zaman belirgin bir istisna olmadan ThreadPoolExecutor üzerinde engeller, neden?


209

Eclipse'deki her zamanki projelerim üzerinde çalışıyorum, Spring, Hibernate ve benzeri ile yapılan bir J2EE uygulaması. Bunun için Tomcat 7 kullanıyorum (özel bir neden yok, yeni bir özellikten faydalanmıyorum, sadece denemek istedim). Uygulamamda her hata ayıkladığımda, Eclipse hata ayıklayıcı bir kesme noktasına ulaşmış gibi ortaya çıkıyor, ancak durum böyle değil, aslında bir Java kaynak dosyasında duruyor ThreadPoolExecutor. Konsolda yığın izi yok, sadece duruyor. Sonra özgeçmiş tıklayın tıklar ve uygulama mükemmel çalışır. Hata ayıklayıcı penceresinde gösterilen şudur:

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

Bunu gerçekten açıklayamıyorum, çünkü hiç kullanmıyorum ThreadPoolExecutor. Tomcat, Hibernate veya Spring'den bir şey olmalı. Çok sinir bozucu çünkü hata ayıklama sırasında her zaman devam etmem gerekiyor.

Herhangi bir ipucu var mı?


1
@ AmosM.Carpenter Java EE değil, JEE değil mi? Kendi bağlantınız bile böyle görünüyor
eis

Yanıtlar:


290

Gönderilen yığın izleme, bir Daemon iş parçacığında RuntimeException ile karşılaşıldığını gösterir. Orijinal geliştirici istisnayı yakalayıp işleme koymadıkça, bu genellikle çalışma zamanında yakalanmaz.

Genellikle, Eclipse'deki hata ayıklayıcı, yakalanmamış tüm istisnalarda istisnanın atıldığı yerde yürütmeyi askıya alacak şekilde yapılandırılır . Kural dışı durumun daha sonra ele alınabileceğini, yığın çerçevesinin altına inebileceğini ve iş parçacığının sonlandırılmasına yol açmayabileceğini unutmayın. Bu, gözlenen davranışın nedeni olabilir.

Eclipse davranışını yapılandırılması : basittir
git Pencere > Tercihler > Java > Debug ve işaretini kaldırın yakalanmamış istisnalarla ilgili yürütme askıya .


Benim durumumda stackoverflow.com/questions/8911146/… yardımcı olmadı :-(
Gangnus

5
Eclipse bug 384073 bu konuda dosyaladım çünkü Web uygulamalarında hata ayıklama yaparken bu seçeneği kullanılamaz hale getiriyor.
Daniel Serodio

9
Eclipse'de "Yakalanmayan istisnalarda yürütmeyi askıya al" seçeneğini devre dışı bırakmak kötü bir çözümdür: Eclipse'nin gerçek yakalanmamış istisnaları askıya almasını isterseniz, örneğin kendi kodunuzdan kaynaklanıyorsa? Bana öyle geliyor ki bu Tomcat bir hata ...

3
@Luis: Aynı şeyi merak ettim! Gereğince bugs.eclipse.org/bugs/show_bug.cgi?id=384073#c4 , tek yapabilirsiniz: devre dışı küresel kırılma noktaları, java.lang.Exception yeni kesme noktası oluşturmak ve bu yeni oluşturulan kesme karşı özel bir filtre uygulamak.
Ocak'ta rektide

3
@Daniel ... Tomcat ekibiyle bir sorun çıkarmak belki daha iyi. Tomcat 7'de bu davranışın yeni olduğunu düşünüyorum ... Eclipse ne gerekiyorsa yapar ... (Asla Eclipse'i bir gün savunacağımı hiç düşünmemiştim ... :)
Stijn de Witt

47

Eclipse'nin RuntimeExceptionsadece belirli bir sınıftan atılan parçaların kırılmasını önleyen daha spesifik bir çözüm var .

  1. Hata ayıklama perspektifinden yeni bir istisna kesme noktası ekleme
  2. Onun git özellikleri
  3. Filtrelemeye Git
  4. "Seçilen Konumlarla Sınırla" bölümünde, " Sınıf Ekle " yi tıklayın
  5. Ekle java.util.concurrent.ThreadPoolExecutor
  6. Onay kutusunun işaretini kaldırın , yani bunlar yok sayılır

1
Tomcat 7 ve Eclipse / STS 3.4.0 ile çalışmasını sağlayamıyorum. Gerekli başka ayarlar var mı? Bu kesme noktasının kayıtlı olması gerekir RuntimeExceptionmi? Etkinleştirilmesi veya devre dışı bırakılması gerekiyor mu? 'Yakalanan konumlar' ve 'Yakalanmayan konumlar' açık mı yoksa kapalı mı olmalıdır?
Henrik Heimbuerger

2
Kural dışı durum kesme noktasının bir java.lang.RuntimeException olması gerekir, etkinleştirilmesi, yalnızca yakalanmamış konum için olması ve java.util.concurrent.ThreadPoolExecutor sınıfının işaretli olmaması gerekir.
mario

Ne yazık ki Ubuntu 14.04'te Eclipse Luna 4.4.0 için "Seçilen Konumlarla Sınırla" mevcut değildir.
eeezyy


2

Bu genellikle sunucu dosyalarını (jsp veya java) değiştirdikten sonra meydana geldiğini fark ettim ve STS uygulamayı yeniden yüklerken sorun yaşıyor.

Bu genellikle değişikliklerin senkronize edilmesini sağlamak için sunucunun yeniden başlatılmasına yol açar.

JRebel'i tanıttıktan sonra - gitmiş gibi görünüyor. Bu nedenle, hata ayıklama modunda hotswapping kodunun STS'de yeniden üretilebilir bir sorun olduğunu düşünmek istiyorum.

Yerel hotswapping öğesini kaldırarak, ThreadPoolExecutor sınıfının içinde kırılma sorununu ortadan kaldırır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.