Posso scoprire il valore restituito prima di tornare durante il debug in Eclipse?


99

È possibile vedere il valore di ritorno di un metodo dopo che la riga è stata eseguita e prima che il puntatore dell'istruzione ritorni alla funzione chiamante?

Sto eseguendo il debug di codice che non posso modificare (leggi: non voglio ricompilare una libreria di terze parti) , ea volte salta a codice a cui non ho origine o l'espressione di ritorno ha effetti collaterali che mi impediscono di essere in grado di eseguire semplicemente l'espressione nella scheda Visualizza .

Spesso il valore restituito viene utilizzato in un'istruzione composta, quindi la vista Variabili non mi mostrerà mai il valore (quindi volendo vedere il risultato prima che il controllo ritorni alla funzione chiamante).

AGGIORNAMENTO: non posso usare il visualizzatore di espressioni perché ci sono effetti collaterali nell'istruzione.


7
Ecco perché sono passato alla versione comunitaria di IntelliJ: la gente di Eclipse non sembra capire quanto sia importante. (Se mai lo aggiusteranno, tornerò indietro il giorno in cui è stato rilasciato.)

@James Mitchell questa sembra un'ottima idea per un plugin. Lo aggiungerò alla mia lista di cose da fare e cercherò di farlo quando avrò tempo (non presto)
IAdapter

@ user672348 Ma come farlo in IntelliJ IDEA?
Alexey Tigarev

@AlexeyTigarev: IIRC, viene visualizzato solo quando fai "Step Return" (o l'equivalente).
Blaisorblade

1
Preparati per Eclipse Oxygen (data di rilascio di metà 2017). La pietra miliare M2 include questa caratteristica .
Abdull

Risposte:


36

Questa funzione è stata aggiunta alla versione 4.7 M2 di Eclipse con il bug 40912 di Eclipse .

Per usarlo:

  • scavalca l' returnistruzione (utilizzando "Step Over" o "Step Return")
  • ora la prima riga nella vista variabile mostrerà il risultato dell'istruzione return, come "[istruzione xxx] restituita:"

Vedere Eclipse Project Oxygen (4.7) M2 - Nuovo e degno di nota per i dettagli.


Anch'io. Mi manca questa funzione quando uso Eclipse.
m24p

1
Questo bug di Eclipse è stato successivamente riaperto alla fine del 2009 . Tuttavia, ancora in attesa di una correzione, senza nessuno assegnato e senza Target Milestone. :)
Mark A. Fitzgerald

1
Questo problema è stato risolto nelle recenti build di Eclipse 4.7 (da M2 in poi)
AbdullahC

1
Alcune informazioni su come utilizzare la correzione possono essere trovate nel Nuovo e degno di nota per 4.7 M2. Cerca "Risultato del metodo dopo le operazioni di passaggio" qui: eclipse.org/eclipse/news/4.7/M2
Joshua Goldberg

@ JoshuaGoldberg: Grazie per averlo sottolineato - l'ho modificato nella risposta.
sleske

34

Ho trovato un'ottima scorciatoia per questo. Selezionare l'espressione che restituisce il valore e premere

Ctrl + Shift + D

Questo mostrerà il valore dell'istruzione return. Questo è davvero utile nei casi in cui non puoi o non vuoi cambiare solo a scopo di debug.

Spero che questo ti aiuti.

Nota: non l'ho testato con librerie di terze parti, ma funziona bene per il mio codice. Testato su Eclipse Java EE IDE per sviluppatori Web. Versione: Juno Service Release 1


4
+1 perché funziona non solo per i valori restituiti, ma per le espressioni in generale. Molto più conveniente rispetto all'utilizzo della scheda espressioni. Va notato che questo esegue il codice, quindi se ha effetti collaterali, fai attenzione. help.eclipse.org/indigo/…
capra

1
Ctrl + Shift + Iè stato utile anche per me.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

2
come menzionato da @goat, questo esegue il codice più volte, quindi, ad esempio, se la funzione lo fa return System.currentTimeMillis();, otterrai un risultato diverso rispetto alla funzione effettivamente restituita!
Brad Parks

Equivalente su un Apple machine?
Adrien Be

Questo è un consiglio problematico: rivaluterà l'espressione, che può essere disastrosa se ha effetti collaterali.
sleske


5

Ecco perché mi attengo sempre al seguente schema per i metodi:

MyReturnedType foo() {
     MyReturnedType   result = null;

     // do your stuff, modify the result or not

     return result;
}

Le mie regole:

  1. Solo un'istruzione return, solo alla fine del metodo (finalmente consentita dopo)
  2. Avere sempre un risultato chiamato locale che contiene il valore restituito, a partire da un valore predefinito.

Naturalmente, i getter più banali sono esenti.


3
Ehi zvikico, quando lavoro sul mio codice, di solito utilizzo un modello simile. Sfortunatamente, il mio problema è quando utilizzo codice che non è scritto o modificabile da me. : S
RodeoClown

Lo faccio anche, ma SonarLint si lamenta .... ora sto equivocando: stackoverflow.com/questions/31733811/...
HDave

@WitoldKaczurba questa è la tua opinione, e va bene. Accetta semplicemente che ci sono altre opinioni e mostra un po 'di rispetto per coloro che lo fanno.
zvikico

Ciao zvikco. Grazie per il messaggio. Accetto che ci siano approcci diversi ma ho fatto riferimento a pmd.sourceforge.io/pmd-4.3.0/rules/… . Cheers
Witold Kaczurba

2

Sono curioso di apprendere anche la risposta a questa domanda.

In passato, quando mi occupavo di librerie di terze parti in questo modo, quello che ho fatto è stato creare una classe wrapper o una classe figlia che delegasse alla classe genitore ed eseguire il debug nella classe wrapper / figlia. Ci vuole però del lavoro extra.


1
Il problema con questa soluzione (a parte quello che hai notato sul lavoro extra) è che funziona solo se non sei più classi / metodi all'interno di una libreria esterna. Ma è utile quando hai a che fare con lo strato esterno dei metodi.
RodeoClown


0

Una difficile. La mia esperienza, al di fuori di Eclipse, è che se potresti aver bisogno di vedere il valore restituito, è meglio assegnarlo a una variabile locale nella funzione in modo che l'istruzione return sia semplice return varname;e non return(some * expression || other);. Tuttavia, questo non ti aiuta terribilmente dal momento che dici che non puoi (o non vuoi) modificare o addirittura ricompilare il codice. Quindi, non ho una buona risposta per te, forse devi riconsiderare la tua richiesta.


Nel mio codice generalmente ho il passaggio intermedio in modo da poter controllare il risultato, ma parte del codice che sto utilizzando ha un sovraccarico organizzativo troppo elevato da modificare (specialmente se la libreria viene aggiornata, non voglio davvero mantenere una versione biforcuta solo per il debug).
RodeoClown

0

A seconda dell'istruzione return, puoi evidenziare l'espressione che viene restituita e dal menu di scelta rapida dovrebbe esserci qualcosa come "valuta espressione" (non ho eclissi davanti a me ora, ma è qualcosa del genere ). Ti mostrerà cosa verrà restituito.


4
Il problema è quando la valutazione della funzionalità di ritorno ha effetti collaterali (come le voci del database create per esempio), la valutazione dell'espressione di ritorno cambierà lo stato del sistema. Grazie per il suggerimento però.
RodeoClown

0

Questo è un po 'inverosimile, ma poiché non sembra esserci un modo semplice:

È possibile utilizzare AspectJ per strumentare il JAR con aspetti che acquisiscono il valore di ritorno dei metodi a cui si è interessati. Secondo la documentazione di Eclipse, i programmi AspectJ possono essere sottoposti a debug come altri programmi.

Ci sono due opzioni per tessere le tue classi senza ricompilare la libreria:

  • Tessitura post-compilazione se l'elaborazione del JAR binario è accettabile;

  • Tessitura a tempo di caricamento, che richiede l'attivazione di un agente di tessitura nella VM.

Vedere la documentazione di eclipse (collegamento sopra) e anche la AspectJ Development Environment Guide .

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.