Come stampare l’attuale traccia di stack in .NET senza eccezioni?

Ho un normale codice C #. Non ho eccezioni . Voglio registrare a livello di codice la traccia dello stack corrente per scopi di debug. Esempio:

public void executeMethod() { logStackTrace(); method(); } 

Dai uno sguardo allo spazio dei nomi System.Diagnostics . Molte cose lì dentro!

 System.Diagnostics.StackTrace t = new System.Diagnostics.StackTrace(); 

Questo è davvero bello avere un colpo in giro per imparare che cosa sta succedendo sotto il cofano.

Ti consigliamo di dare un’occhiata alle soluzioni di registrazione (come NLog, log4net o i modelli Microsoft e le pratiche di Enterprise Library) che possono raggiungere i tuoi scopi e poi alcuni. Buona fortuna amico!

Un’alternativa a System.Diagnostics.StackTrace consiste nell’utilizzare System.Environment.StackTrace che restituisce una rappresentazione di stringa dello stacktrace.

Un’altra opzione utile consiste nell’utilizzare le variabili di debug $CALLER e $CALLSTACK in Visual Studio poiché è ansible abilitare il runtime senza ribuild l’applicazione.

Ci sono due modi per farlo. System.Diagnostics.StackTrace() ti darà una traccia dello stack per il thread corrente. Se si dispone di un riferimento a un’istanza di Thread , è ansible ottenere la traccia di stack per tale tramite la versione sovraccaricata di StackTrace() .

Puoi anche controllare la domanda Stack Overflow Come ottenere lo stacktrace del thread non corrente? .

Puoi anche farlo nel debugger di Visual Studio senza modificare il codice.

  1. Creare un breakpoint in cui si desidera visualizzare la traccia dello stack.
  2. Fare clic con il pulsante destro del punto di interruzione e selezionare “Azioni …” in VS2015. In VS2010, selezionare “Quando si colpisce …”, quindi abilitare “Stampa un messaggio”.
  3. Assicurati che “Continua l’esecuzione” sia selezionato.
  4. Digita il testo che desideri stampare.
  5. Aggiungi $ CALLSTACK ovunque tu voglia vedere la traccia dello stack.
  6. Esegui il programma nel debugger.

Naturalmente, questo non aiuta se si sta eseguendo il codice su una macchina diversa, ma può essere molto utile poter sputare automaticamente una traccia dello stack senza influire sul codice di rilascio o senza dover riavviare il programma.

  private void ExceptionTest() { try { int j = 0; int i = 5; i = 1 / j; } catch (Exception ex) { Console.WriteLine("Error: " + ex.Message); var stList = ex.StackTrace.ToString().Split('\\'); Console.WriteLine("Exception occurred at " + stList[stList.Count() - 1]); } } 

Sembra funzionare per me