2009-05-04 5 views
10

Sto parlando di codice gestito .NET. Se eseguiamo qualsiasi programma e colleghiamo VS ad esso possiamo vedere i valori dei parametri per ogni metodo nello stack di chiamate. Mi piacerebbe creare una soluzione di registrazione che registrerà i valori di tutti i parametri per ogni metodo nello stack di chiamate. In realtà ho bisogno di queste informazioni nel caso si verifichi un'eccezione.È possibile ottenere i valori dei parametri per ogni frame nello stack di chiamate in .NET

So che è possibile con l'API di profilazione. Ma mi chiedo è possibile solo con il codice gestito?

UPDATE: Ok, probabilmente con puro .NET è impossibile. Quindi potrebbe essere con qualche tipo di codice non gestito ... il punto è farlo dall'interno dell'applicazione stessa. Un'applicazione in caso di un'eccezione potrebbe chiamare una libreria (potrebbe essere non gestita) che restituisce informazioni sui valori dei metodi nello stack di chiamate. Solo pensieri ...

+1

Si noti che le ottimizzazioni, in particolare in modalità "Rilascio", inlining ecc., Possono rendere le informazioni non visualizzate nello stack di chiamate. È meglio non fare affidamento su questo tipo di informazioni. – Lucero

+1

Certo, la logica dell'app non dovrebbe basarsi su tali informazioni. Ma sto solo parlando di registrazione per scopi diagnostici. – Shrike

+0

L'ho capito. Tuttavia, se si ottiene un estratto del registro e non si hanno informazioni affidabili al suo interno, la sua utilità è limitata. – Lucero

risposta

8

I valori dei parametri non sono memorizzati nell'istanza StackFrame. In realtà, non vengono registrati/registrati affatto, a meno che non si scelga di farlo esplicitamente.

Un modo ovvio per registrare questi valori è utilizzare AOP. Ciò implicherebbe certamente un costo, ma in combinazione con una struttura di registrazione e il livello di registro corretto, potrebbe essere un'alternativa. Puoi anche scegliere di utilizzare solo alcuni tipi/metodi nel tuo codice base, dove è più probabile che vengano lanciate eccezioni. Probabilmente scegliere Postsharp per le sue capacità di tessitura statica, per emettere chiamate di registro.

In ogni caso, è lungi dall'essere una soluzione ideale, ma temo che non avrai molte opzioni se sei bloccato nel mondo gestito.

2

L'opzione migliore è probabilmente inserire il codice di traccia richiesto nei metodi pertinenti. In questo modo è possibile collegare i listener di traccia e i valori di dumping quando necessario.

So che non è quello che stai chiedendo, ma è un modo per ottenere i dati.

In alternativa, è possibile eseguire il debug dell'applicazione utilizzando WinDbg. I comandi! Clstack /! Dso ti permetteranno di ispezionare i parametri e impilare gli oggetti.