Eclipse debugger selalu memblokir di ThreadPoolExecutor tanpa pengecualian yang jelas, mengapa?

209

Saya sedang mengerjakan proyek-proyek saya yang biasa di Eclipse, ini adalah aplikasi J2EE, dibuat dengan Spring, Hibernate dan sebagainya. Saya menggunakan Tomcat 7 untuk ini (tidak ada alasan khusus, saya tidak mengeksploitasi fitur baru, saya hanya ingin mencobanya). Setiap kali saya men-debug aplikasi saya, kebetulan Eclipse debugger muncul seperti itu telah mencapai breakpoint, tetapi itu tidak terjadi, bahkan berhenti pada file sumber Java ThreadPoolExecutor. Tidak ada jejak stack di konsol, itu hanya berhenti. Kemudian jika saya mengklik resume, ini akan menyala dan aplikasi berfungsi dengan baik. Inilah yang ditampilkan di jendela debugger:

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

Saya benar-benar tidak dapat menjelaskan ini, karena saya tidak menggunakan ThreadPoolExecutorsama sekali. Pasti ada sesuatu dari Tomcat, Hibernate, atau Spring. Ini sangat menjengkelkan karena saya selalu harus melanjutkan selama debugging.

Ada petunjuk?

Gotch4
sumber
1
@ AmosM.Carpenter bukan Java EE, bukan JEE? Bahkan tautan Anda sendiri sepertinya menyarankan begitu
eis

Jawaban:

290

Jejak tumpukan yang diposting menunjukkan bahwa RuntimeException ditemukan di utas Daemon. Ini biasanya tidak tertangkap saat runtime, kecuali jika pengembang asli menangkap dan menangani pengecualian.

Biasanya, debugger di Eclipse dikonfigurasikan untuk menunda eksekusi di lokasi di mana pengecualian dilemparkan, pada semua pengecualian yang tidak tertangkap . Perhatikan bahwa pengecualian mungkin ditangani nanti, turunkan lebih rendah dalam bingkai tumpukan dan mungkin tidak menyebabkan utas dihentikan. Ini akan menjadi penyebab perilaku yang diamati.

Mengkonfigurasi perilaku Eclipse sangat mudah:
Buka Window > Preferences > Java > Debug dan hapus centang Tangguhkan eksekusi dengan pengecualian yang tidak tertangkap .

Vineet Reynolds
sumber
Dalam kasus saya stackoverflow.com/questions/8911146/... itu tidak membantu :-(
Gangnus
5
Saya telah mengajukan bug Eclipse 384073 tentang ini karena ini pada dasarnya membuat opsi ini tidak dapat digunakan ketika men -debug aplikasi Web.
Daniel Serodio
9
Menonaktifkan "Tangguhkan eksekusi atas pengecualian yang tidak tertangkap" di Eclipse adalah solusi yang buruk: bagaimana jika Anda ingin Eclipse menunda dengan pengecualian yang tidak tertangkap, misalnya yang berasal dari kode Anda sendiri? Menurut saya ini adalah bug di Tomcat ...
3
@Luis: Saya juga bertanya-tanya! Sesuai bugs.eclipse.org/bugs/show_bug.cgi?id=384073#c4 , seseorang dapat: menonaktifkan breakpoint global, membuat breakpoint baru di java.lang.Exception, dan menerapkan filter eksklusif terhadap breakpoint yang baru dibuat ini.
rektide
3
@Aniel ... Mungkin lebih baik untuk mengajukan masalah dengan tim Tomcat. Saya pikir perilaku ini baru di Tomcat 7 ... Eclipse melakukan apa yang seharusnya dilakukan ... (tidak pernah berpikir saya akan akhirnya membela Eclipse suatu hari ... :)
Stijn de Witt
48

Ada solusi yang lebih spesifik, yang mencegah Eclipse RuntimeExceptionberhenti hanya dari kelas yang diberikan.

  1. Tambahkan breakpoint pengecualian baru dari perspektif Debugging
  2. Pergi ke propertinya
  3. Pergi ke Pemfilteran
  4. Di "Batasi ke Lokasi Terpilih", klik " Tambah Kelas "
  5. Menambahkan java.util.concurrent.ThreadPoolExecutor
  6. Hapus centang pada kotak centang , artinya ini akan diabaikan
EngineerBetter_DJ
sumber
1
Sepertinya saya tidak bisa membuatnya bekerja dengan Tomcat 7 dan Eclipse / STS 3.4.0. Apakah ada pengaturan lain yang diperlukan? Haruskah breakpoint ini didaftarkan pada RuntimeException? Apakah itu harus diaktifkan atau dinonaktifkan? Haruskah 'Lokasi tertangkap' dan 'Lokasi tidak tertangkap' hidup atau mati?
Henrik Heimbuerger
2
Tampaknya breakpoint pengecualian harus berupa java.lang.RuntimeException, harus diaktifkan, harus hanya untuk lokasi yang tidak tertangkap, dan tidak boleh memeriksakan kelas java.util.concurrent.ThreadPoolExecutor.
mario
Sayangnya di Ubuntu 14.04 "Restrict to Selected Location" (s) "tidak tersedia, untuk Eclipse Luna 4.4.0.
eeezyy
2

Saya perhatikan bahwa ini sering terjadi setelah memodifikasi file server (jsp atau java) dan STS mengalami kesulitan memuat ulang aplikasi.

Ini biasanya mengarah ke me-restart server untuk mendapatkannya agar perubahan disinkronkan.

Setelah memperkenalkan JRebel - tampaknya sudah hilang. Jadi, saya ingin berpikir itu adalah masalah yang dapat direproduksi dalam STS ketika kode hotswapping dalam mode debug.

Dengan menghapus hotswapping asli, itu menghilangkan masalah dengan itu melanggar di dalam kelas ThreadPoolExecutor.

DaCrazyCoder
sumber