Il debugger di Eclipse si blocca sempre su ThreadPoolExecutor senza alcuna ovvia eccezione, perché?


209

Sto lavorando ai miei soliti progetti su Eclipse, è un'applicazione J2EE, realizzata con Spring, Hibernate e così via. Sto usando Tomcat 7 per questo (nessun motivo particolare, non utilizzo nessuna nuova funzionalità, volevo solo provarlo). Ogni volta che eseguo il debug della mia applicazione, capita che il debugger di Eclipse esploda come se avesse raggiunto un punto di interruzione, ma non è così, in realtà si ferma su un file sorgente Java che lo è ThreadPoolExecutor. Non c'è traccia dello stack sulla console, si ferma. Quindi, se faccio clic su Riprendi, continua e l'app funziona perfettamente. Questo è ciò che mostra nella finestra del debugger:

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

Non riesco davvero a spiegarlo, perché non lo sto usando ThreadPoolExecutoraffatto. Deve essere qualcosa di Tomcat, Hibernate o Spring. È molto fastidioso perché devo sempre riprendere durante il debug.

Qualche indizio?


1
@ AmosM.Carpenter non è Java EE, non JEE? Anche il tuo link sembra suggerirlo
eis

Risposte:


290

La traccia dello stack pubblicata indica che è stata rilevata una RuntimeException in un thread Daemon. In genere, questo non viene rilevato durante l'esecuzione, a meno che lo sviluppatore originale non abbia rilevato e gestito l'eccezione.

In genere, il debugger in Eclipse è configurato per sospendere l'esecuzione nella posizione in cui è stata generata l'eccezione, su tutte le eccezioni non rilevate . Si noti che l'eccezione potrebbe essere gestita in un secondo momento, più in basso nel frame dello stack e potrebbe non portare alla conclusione del thread. Questa sarebbe la causa del comportamento osservato.

La configurazione del comportamento di Eclipse è semplice:
vai su Finestra > Preferenze > Java > Debug e deseleziona Sospendi esecuzione su eccezioni non rilevate .


Nel mio caso stackoverflow.com/questions/8911146/... non ha aiutato :-(
Gangnus

5
Ho archiviato il bug Eclipse 384073 su questo poiché essenzialmente rende questa opzione inutilizzabile durante il debug delle app Web.
Daniel Serodio,

9
Disabilitare "Sospendi l'esecuzione su eccezioni non rilevate" su Eclipse è una pessima soluzione alternativa: cosa succede se si desidera che Eclipse sospenda su eccezioni non rilevate reali, ad esempio provenienti dal proprio codice? Mi sembra che questo sia un bug in Tomcat ...

3
@Luis: mi chiedevo lo stesso! Secondo bugs.eclipse.org/bugs/show_bug.cgi?id=384073#c4 , è possibile: disabilitare i punti di interruzione globali, creare un nuovo punto di interruzione su java.lang.Exception e applicare un filtro esclusivo a questo punto di interruzione appena creato.
rektide del

3
@Daniel ... Forse è meglio presentare un problema con il team Tomcat. Penso che questo comportamento sia nuovo in Tomcat 7 ... Eclipse fa quello che dovrebbe fare ... (non avrei mai pensato che avrei finito per difendere Eclipse un giorno ... :)
Stijn de Witt

48

C'è una soluzione più specifica, che impedisce che Eclipse si rompa su RuntimeExceptionlanciati solo da una determinata classe.

  1. Aggiungi un nuovo punto di interruzione delle eccezioni dalla prospettiva Debug
  2. Vai alle sue proprietà
  3. Vai a Filtro
  4. In "Limita a località selezionate", fai clic su " Aggiungi classe "
  5. Inserisci java.util.concurrent.ThreadPoolExecutor
  6. Deseleziona la casella di controllo , il che significa che verranno ignorati

1
Non riesco a farlo funzionare con Tomcat 7 ed Eclipse / STS 3.4.0. Ci sono altre impostazioni necessarie? Questo breakpoint deve essere registrato RuntimeException? Deve essere abilitato o disabilitato? 'Posizioni individuate' e 'Posizioni non rilevate' dovrebbero essere attivate o disattivate?
Henrik Heimbuerger,

2
Sembra che il punto di interruzione dell'eccezione debba essere java.lang.RuntimeException, deve essere abilitato, deve essere solo per la posizione non rilevata e non deve essere selezionata la classe java.util.concurrent.ThreadPoolExecutor.
Mario,

Sfortunatamente su Ubuntu 14.04 il "Limita a posizioni selezionate" non è disponibile, per Eclipse Luna 4.4.0.
eeezyy,


2

Ho notato che ciò si verifica spesso dopo aver modificato i file del server (jsp o java) e che STS ha difficoltà a ricaricare l'applicazione.

Questo di solito porta al riavvio del server per ottenerlo per sincronizzare le modifiche.

Dopo aver introdotto JRebel, sembra essere andato via. Quindi, vorrei pensare che sia un problema riproducibile in STS quando si esegue l'hotswapping del codice in modalità debug.

Rimuovendo l'hotswapping nativo, elimina il problema che si interrompe all'interno della classe ThreadPoolExecutor.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.