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 ThreadPoolExecutor
sama sekali. Pasti ada sesuatu dari Tomcat, Hibernate, atau Spring. Ini sangat menjengkelkan karena saya selalu harus melanjutkan selama debugging.
Ada petunjuk?
Jawaban:
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 .
sumber
Ada solusi yang lebih spesifik, yang mencegah Eclipse
RuntimeException
berhenti hanya dari kelas yang diberikan.java.util.concurrent.ThreadPoolExecutor
sumber
RuntimeException
? Apakah itu harus diaktifkan atau dinonaktifkan? Haruskah 'Lokasi tertangkap' dan 'Lokasi tidak tertangkap' hidup atau mati?Perilaku ini dipicu oleh kucing jantan ketika webapp dimuat ulang. Ini adalah bagian dari fitur "perlindungan kebocoran memori" kucing jantan yang (antara lain) memaksa pembaruan utasnya.
Ini sekarang diperbaiki dari versi 7.0.54 dan 8.0.6 dari kucing jantan: https://issues.apache.org/bugzilla/show_bug.cgi?id=56492
sumber
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.
sumber