È possibile ottenere i valori dei parametri per ogni frame nello stack di chiamate in .NET

StackOverflow https://stackoverflow.com/questions/819576

  •  03-07-2019
  •  | 
  •  

Domanda

Sto parlando del codice .NET gestito. Se eseguiamo un programma e vi colleghiamo VS, possiamo vedere i valori dei parametri per ogni metodo nello stack di chiamate. Vorrei creare una soluzione di registrazione che registrerà tutti i valori dei parametri per ciascun metodo nello stack di chiamate. In realtà ho bisogno di queste informazioni nel caso in cui si verifichi un'eccezione.

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

AGGIORNAMENTO: Ok, probabilmente con .NET puro è 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 alcune librerie (potrebbe non essere gestita) che restituisce informazioni sui valori dei metodi nello stack di chiamate. Solo pensieri ...

È stato utile?

Soluzione

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

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

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

Altri suggerimenti

L'opzione migliore è probabilmente quella di inserire il codice di traccia richiesto nei metodi pertinenti. In questo modo è possibile allegare listener di tracce e scaricare valori 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top