2009-11-09 10 views
16

È possibile ottenere il valore di ritorno di un metodo nel debugger di Visual Studio, anche se tale valore non è assegnato a una variabile locale? Ad esempio, sto debug il seguente codice:Ottenere un valore di ritorno di un metodo nel VS Debugger

public string Foo(int valueIn) 
{ 
    if (valueIn > 100) 
     return Proxy.Bar(valueIn); 
    else 
     return "Not enough"; 
} 

Dal momento che non sto impostando le variabili locali nel Foo, e assumendo non sto impostando un punto di rottura in qualunque sta chiamando Foo, c'è un modo per vedere qual è il valore di ritorno se ho un breakpoint all'interno di Foo (o in un altro modo)? Non ho molta esperienza con le finestre Autos o Intermediate, quindi non sono sicuro che queste siano o meno un'opzione valida.

+0

Vedi anche [questa domanda] (http://stackoverflow.com/questions/268048/can-i-find-out-the-return-value-before-returning-while-debugging-in-visual-studio) –

+3

[Questa funzione è nuova in VS2013] (http://blogs.msdn.com/b/visualstudioalm/archive/2013/06/27/seeing-function-return-values-in-the-debugger-in-visual- studio-2013.aspx). – shambulator

+0

[questo] (http: // StackOverflow.domanda/domande/268048/can-i-find-out-the-return-value-before-return-while-debugging-in-visual-studi) può anche aiutare. – RBT

risposta

6

è possibile impostare un punto di interruzione in Foo, aprire la finestra immediata ed eseguire il seguente comando:

? Foo(valueIn) 

Questo stamperà il valore di ritorno nella finestra immediata.

È anche possibile copiare l'espressione e incollarla nella finestra di controllo, anche se lo farei solo se sono certo che la chiamata non ha effetti collaterali (altrimenti è possibile ottenere risultati confusi).

+12

Questo eseguirà di nuovo la funzione, che non è necessariamente una buona idea. – SLaks

+0

L'uso della variabile del debugger di Visual Studio '$ ReturnValue' nella finestra di quick-watch o nella finestra immediata è molto meglio e senza rischi. Dai un'occhiata [qui] (http://stackoverflow.com/questions/268048/can-i-find-out-the-return-value-before-returning-while-debugging-in-visual-studi) – RBT

2

No, non conosco un modo per farlo. Vorrei inserire un punto di interruzione nel chiamante e osservare il valore restituito lì.

5

È sempre possibile passare alla visualizzazione del disassemblatore e passare attraverso le singole istruzioni. Il valore di ritorno sarà in @eax (o @rax) appena prima di eseguire l'istruzione 'ret'.

+0

... O dopo quello! Per esempio. dopo aver premuto F10/Maiusc-F11/il cursore ritorna alla funzione genitore. Questo è utile quando si restituisce un tipo di valore. Il problema è che il valore può essere un puntatore inutile senza dereferenziazione. –

2

È inoltre possibile evidenziare qualsiasi espressione nel debugger e fare clic con il tasto destro del mouse su -> quick watch. Questo eseguirà l'espressione (supponendo che sia valida) e ti darà il valore.

0

È sempre possibile utilizzare la casella di controllo per valutare le chiamate di funzione.

Foo (valueIn);

Questo funziona solo se il tuo Proxy.Bar (valueIn) è indipendente dal tempo.

+0

La parola stai cercando è idempotente. – SLaks

0

Una soluzione è quella di utilizzare una variabile risultato in stile Pascal:

public string Foo(int valueIn) 
{ 
    string result; 
    if (valueIn > 100) 
     result = Proxy.Bar(valueIn); 
    else 
     result = "Not enough"; 
    return result; 
} 

Questo è buon stile a mio parere per le funzioni più lunghi. Per quelli molto brevi come quello sopra potrebbe essere considerato eccessivo, ma si aggira il problema del debugger.

0

La risposta di una domanda simile là fuori: In VS 2013, è possibile aggiungere la variabile $ ReturnValue all'orologio. Contiene il valore di ritorno effettivo dalla funzione.

Credito a Jesper Jensen.

Problemi correlati