2012-05-26 13 views
13

posso ottenere informazioni su un parametro da StackTrace utilizzando qualcosa di simile:Come ottenere valore dei parametri in stacktrace

catch (Exception ex) 
{ 
    var st = new StackTrace(ex); 

    System.Reflection.ParameterInfo pi = st.GetFrame(0).GetMethod().GetParameters().First(); 
} 

voglio sapere come ottenere il valore del parametro. Esempio:

Se il mio metodo nella traccia dello stack è stato come:

void MyMethod(object value) 

E la chiamata era come:

MyMethod(10); 

voglio ottenere il valore 10. Come ho fatto?

+0

possibile duplicato di [È possibile ottenere i valori dei parametri 'per ogni frame nello stack di chiamate in .NET] (http://stackoverflow.com/questions/819576/is-it-possible-to-get-parameters- valori-per-ogni-frame-in-call-stack-in-net) – nawfal

risposta

9

Ci sono due modi. Più potente è l'API COM per .NET Debugging. Ad esempio, gli argomenti e le variabili locali di funzione nello stack di chiamate sono entrambi accessibili da ICorDebugILFrame. Ma questo deve essere eseguito da un processo separato che è collegato al tuo processo come debugger.

Per l'introspezione in-process, c'è lo Profiler API, which also can find information about function arguments. Guarda le informazioni su "shadow stack".

+0

fyi, il tuo secondo link è morto – Fredou

+1

@Fredou: Grazie per avermelo fatto notare, ho aggiornato il collegamento al nuovo indirizzo delle informazioni. –

+0

Esempio per favore! – Demodave

3

Non con C# eccetto se si sta creando una soluzione con una versione CLR (patch) molto elevata. Ma quello che funziona è quello di collegare Windbg al vostro processo, caricare sos.dll passare a tuo thread e digitare

!ClrStack -p 

per mostrare lo stack di chiamate gestite e i parametri del metodo per la maggior parte dei metodi. Questo è anche sotto il debugger non infallibile perché a causa delle ottimizzazioni JIT e dell'inlin lo stack layout è molto flessibile. Oltre a questo alcuni parametri potrebbero non essere visualizzati nella memoria dello stack perché sono passati attraverso i registri (che è ancora più comune sotto la piattaforma x64).

Per rispondere alla prima domanda. No, non è possibile con l'approccio che stai provando. Una soluzione operativa sarebbe possibile ma non per niente portatile. Un debugger gestito può recuperare in parte i tuoi argomenti ma non esiste una soluzione di lavoro al 100% (anche con il debugger).

Problemi correlati