Come tornare indietro nel debugger di Eclipse?


129

È possibile eseguire l'esecuzione inversa nel debugger di Eclipse? Il progetto attuale a cui sto lavorando richiede almeno 5 secondi per leggere e inizializzare i dati da un file prima di poter fare qualsiasi cosa. Se supero il debugger, devo terminare il programma e riavviare, e questo richiede un bel po 'di tempo.

Risposte:


136

Puoi usare il comando drop to frame di Eclipse per reinserire il metodo corrente dall'alto. Ma non srotolerà eventuali cambiamenti di stato verificatisi, quindi potrebbe non funzionare a seconda del tipo di metodo in cui ti trovi.

Un altro strumento davvero interessante che in realtà ti consente di fare un passo avanti e indietro nel tempo è l' Onniscient Debugger . Funziona strumentando le classi mentre vengono caricate nel classloader, quindi può registrare tutto ciò che fa il tuo codice. Può fare cose molto interessanti, come rispondere "quando, dove e perché a questo campo è stato assegnato il suo valore attuale?". L'interfaccia utente è piuttosto complessa e può avere difficoltà a gestire basi di codice di grandi dimensioni, ma in alcuni casi può davvero risparmiare molto tempo.

Aggiornamento : Chronon fornisce un prodotto commerciale che descrive come "DVR per Java", che sembra fare molte delle stesse cose dell'ODB.


@Matt McHenry Stavo cercando di usare ODB1.5; con un programma java autonomo ma non sono sicuro di come farlo funzionare? Hai altre risorse oltre al sito ODB che spiega i passaggi per farlo funzionare autonomamente e con Eclipse?
Ayusman,

@Ayusman: no, mi dispiace, non ho nulla da condividere oltre a quello che c'è sul sito ODB. Non sarei sorpreso se non funzionasse con i nuovi formati di file .class, tra le altre cose. :(
Matt McHenry,

Risposta interessante!
KrishPrabakar,

Sembra che il sito web di Omnscient Debugger sia stato assegnato al dominio.
Thorbjørn Ravn Andersen,

45

Oltre a ciò che è stato menzionato nelle risposte precedenti, ovvero la funzione drop to frame di Eclipse nella vista debug , che riavvia il debug in precedenza nel frame dello stack (ma non ripristina i dati globali / statici) e il debugger onnisciente , che è un po 'grezzo e non tanto in evoluzione - ci sono alcuni strumenti basati su Eclipse che potrebbero essere utilizzati per "tornare indietro" nel tempo (di esecuzione):

JIVE estende il debugger di Eclipse Java con la possibilità di registrare gli stati del programma. La prospettiva JIVE fornisce alcuni utili diagrammi UML che vengono aggiornati mentre il programma è in esecuzione. Questi diagrammi forniscono una panoramica dello stato dell'applicazione (diagramma degli oggetti) e della traccia dello stack (diagramma di sequenza). È possibile eseguire una query sulla traccia memorizzata e fare un passo avanti e indietro nel tempo e vedere i diagrammi corrispondenti.

Diver registra solo le chiamate di metodo e in realtà non registra stati del programma come JIVE. Ogni evento di chiamata del metodo viene archiviato per il successivo recupero e analisi. Estende le configurazioni Java Run e Debug principalmente per specificare i filtri. La traccia può essere messa in pausa / ripresa / filtrata in fase di esecuzione. Una volta registrata, la prospettiva Diver può visualizzarla in un diagramma di sequenza interattivo.

JIVE e Diver sono progetti open source emessi da ricerche accademiche. A partire da novembre 2012 entrambi i progetti sono attivi.

Chronon è un prodotto commerciale, ma hanno licenze gratuite per studenti e progetti open source. Da quanto viene rivendicato sul loro sito Web è probabilmente il registratore più completo poiché è in grado di riprodurre la cronologia registrata, fare un passo avanti e indietro, permettendo come si dice il debug dei viaggi nel tempo. Inoltre, Eclipse non è necessario per la registrazione.

Tutti questi plugin sono abbastanza avidi di risorse, quindi è meglio avere una buona macchina specifica e usare la loro funzione di filtro. Un requisito preciso per eseguirli correttamente è estendere lo spazio heap in eclipse.ini .

Nel mio caso ho provato a usare JIVE e Diver per eseguire il debug di un programma di analisi XML, ma alla fine ho sempre congelato l'eclissi a causa della mancanza di risorse. Diver potrebbe essere complicato da eseguire su Linux 64 bit , funziona su Ubuntu 32 bit e possibilmente altre distribuzioni a 32 bit usando questi suggerimenti . L'operatore subacqueo funziona su Windows, meglio ancora su una JVM a 64 bit + 64 bit di Windows, altrimenti sarai limitato a uno spazio di heap massimo di 1,3-1,6 GB su finestre a 32 bit . JIVE funziona alla grande sul mio Linux a 64 bit e sembra funzionare bene su altre piattaforme.



12

, Eclipse CDT supporta le funzionalità di debug storico.

Apri Configurazione debug -> Debugger -> Abilita debugging inverso all'avvio .

Quindi puoi premere shift+F5o shift+F6per tornare indietro come F5o F6per fare un passo avanti.


1
Questa opzione esiste in tutte le versioni di Eclipse? Sono in pericolo se riesco a trovarlo ovunque.
EngineerBetter_DJ

1
La sua funzione GDB sourceware.org/gdb/wiki/ReverseDebug supportata in Eclipse da questa richiesta bugs.eclipse.org/bugs/show_bug.cgi?id=258284 . Beh, suppongo che la risposta sia sì dal 2009.
Sergei,

È accessibile in CDT.
Sergei,

Sono uno sviluppatore Java, quindi immagino che CDT non mi sarà molto utile?
EngineerBetter_DJ

@Sergei Lo sto facendo su Windows 7 SP1 con una vecchia versione di Springsource. Per abilitare il debug inverso devi prima eseguire il debug come-> Configurazioni di debug-> Principale. Nella parte inferiore della pagina è il programma di avvio del processo. Dirà "Utilizzo dell'utilità di avvio del processo di creazione standard" e verrà visualizzato un collegamento ipertestuale a "Seleziona altro ...". Fare clic su questo e assicurarsi che "Usa impostazioni specifiche di configurazione" sia selezionato, quindi selezionare "GDB (GSF) Crea processo di avvio" e fare clic su OK. "Utilizzo di GDB (GSF) Create Process Launcher" verrà ora visualizzato nella parte inferiore della scheda principale.
Sammy,

5

Sono di parte, ma Chronon fa esattamente quello che stai cercando.

Drop to Frame non fa esattamente un passo indietro, poiché se il metodo ha cambiato qualcosa nell'heap non verrà ripristinato.


1
Chronon ti consente di farlo in tempo reale? La mia comprensione è che prima devi registrare una sessione usando chronon e quindi puoi eventualmente fare un passo indietro in quella sessione. Non è buono come riavviare l'applicazione? O forse mi manca qualcosa ..
Raam,

2
sì, devi prima registrare la tua applicazione e poi puoi eseguirne il debug in qualsiasi momento successivo alla registrazione. È diverso dal riavvio dell'applicazione poiché non è necessario eseguire tutti i passaggi per riprodurre il bug. Tutto quello che fai è registrare il bug una volta e poi puoi guardarlo ogni volta che vuoi eseguire il debug usando solo la registrazione. Non è necessaria alcuna parte dell'ambiente originale per riprodurre la registrazione.
pdeva,

Chronon funziona in ambiente docker? La mia eclisse non è sul locale ..
Choi,

3

Stavo cercando questa funzione anche in Eclipse. So che lo studio visivo può farlo. In realtà puoi trascinare il marcatore di linea corrente e rilasciarlo ovunque nel codice. Non sono abbastanza sicuro se le modifiche alle variabili possano essere annullate. Ma è comunque molto utile e fa risparmiare molto tempo. Lo aspetto da molto tempo in eclissi.


1

La domanda non specifica un linguaggio Eclipse e molte delle risposte assumono Java.

Se si utilizza C ++ e GCC con il debugger GDB, Eclipse ha Run->Move to Lineil compito e funzioni come Visual Studio Set Next Statement . In questo caso, Eclipse utilizza la funzionalità di GDB.

Se utilizzo Java, non sono a conoscenza di un modo per farlo con Eclipse o Netbeans, anche se altre risposte hanno suggerito plugin. Eclipse ha il comando "drop to frame" che funziona per Java nella mia versione (Juno SR1). Se modifico e salvo il codice all'interno di una funzione in modalità debug, la riga di esecuzione si sposta automaticamente all'inizio della funzione corrente e posso continuare da lì. Non è lo stesso che specificare la linea, ma è qualcosa.

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.