2013-03-08 11 views
7

Sto cercando di eseguire il seguente codice con punti di rottura come segue:IntelliJ - non fermarsi su tutti i punti di interruzione nel codice multithreading

new Thread(new Runnable() { 
     @Override 
     public void run() { 
      System.out.println("Starting"); //breakpoint here 
     } 
    }).start(); 

    int i = 10; 
    i++; //breakpoint here 

quando questo codice viene eseguito solo il parametro i ++ punto di interruzione viene colpito ... Se rimuovo quello, il punto di interruzione dell'altro thread verrebbe colpito correttamente. Perché si verifica questo comportamento strano?

risposta

6

questo è documentato in http://www.jetbrains.com/idea/webhelp/breakpoints-2.html:

ci sono alcuni casi in cui IntelliJ IDEA non si ferma ad un punto di interruzione. Si consideri la seguente situazione: Due punti di interruzione sono impostati sui diversi metodi di una classe e la politica di sospensione è impostata su Tutti. Quando viene colpito uno dei punti di interruzione, vengono eseguite alcune azioni del passaggio. Se al momento di passare un altro thread raggiunge il secondo punto di interruzione, IntelliJ IDEA non si fermerà qui.

Ho copiato il tuo esempio di codice e ricreato la situazione. Abbastanza sicuro, come si dice nella documentazione, dopo essersi fermato sul punto di interruzione i++, se si preme F8 (passaggio sopra) il programma non si ferma sull'altro punto di interruzione. Ma se premo F9 (riprendi) il programma fa fermarsi di nuovo sull'altro breakpoint.

+0

Personalmente ritengo che questa sia una condizione di gara. Nel mio caso * resume * fa ancora ** non ** innescare il breakpoint sul nuovo thread. L'unico modo per risolvere è quello di non rompere giusto prima di iniziare una nuova discussione. Quindi tutto funziona. – kervin

+0

Il criterio di sospensione sui punti di interruzione è impostato su "Tutto" (anziché su "Discussione")? –

+0

Sì, lo sono tutti. Posso attivare il problema semplicemente spostando il punto di interruzione più vicino/più lontano dall'inizio della discussione, in modo che da solo confermi una condizione di competizione di qualche tipo. – kervin

0

Poiché l'altro thread è pianificato da eseguire in background e quando lo scheduler del sistema operativo OS decide di eseguirlo, verrà eseguito. Quando avrai un punto di interruzione, sarà colpito.

Non è stato avviato necessariamente quando si esegue il codice, quindi il punto di interruzione su i++ viene colpito immediatamente.

+0

Il punto di interruzione non ha MAI colpito ...il thread principale termina l'esecuzione, posso vedere la stringa "Starting" stampata, quindi la riga è stata eseguita, ma non è stato raggiunto nessun breakpoint – Bober02

+0

@ Bober02 forse il debugger non eseguirà il debug multithreading? –

0

Ho appena avuto questo problema e per il bene di altri che si imbattono in questo, ecco la ragione di questo comportamento e come cambiarlo.

Come ha sottolineato Doron, c'è una documentazione a riguardo. Tuttavia, la cosa IMPORTANTE di IMPORTANTE è che per impostazione predefinita, tutti i thread in JVM vengono sospesi quando viene raggiunto un punto di interruzione.

Quello che ti aspetti (e quello che mi aspettavo) è che solo il thread con il punto di interruzione è sospeso.

Questo non è quello che vuoi, né è quello che volevo.

Per modificare questo comportamento (e fornire il comportamento desiderato).

1) Creare un punto di interruzione facendo clic con il tasto sinistro del mouse sul margine.
2) Premere ctrl + MAIUSC + F8 (per visualizzare il menu Punto di interruzione).
3) Selezionare il punto di interruzione. Vedrai le opzioni per questo.
4) Assicurarsi che "Suspend" sia selezionato e che l'opzione radio "Thread" sia selezionata.
5) Fare clic sul pulsante "Imposta come predefinito".

Ora, quando corri, vedrai che i punti di interruzione in diversi thread vengono colpiti.

Problemi correlati