c# - stacktrace - ¿Cómo imprimir el seguimiento de pila actual en.NET sin ninguna excepción?
c# get call stack programmatically (5)
Tengo un código C # regular. No tengo excepciones . Quiero registrar de manera programática el seguimiento actual de la pila para propósitos de depuración. Ejemplo:
public void executeMethod()
{
logStackTrace();
method();
}
Echa un vistazo al espacio de nombres System.Diagnostics
. Un montón de golosinas allí!
System.Diagnostics.StackTrace t = new System.Diagnostics.StackTrace();
Esto es realmente bueno tener un empujón para aprender qué sucede debajo del capó.
Le recomiendo que revise las soluciones de registro (como NLog, log4net o la biblioteca empresarial de patrones y prácticas de Microsoft) que pueden alcanzar sus propósitos y algunos más. ¡Buena suerte compañero!
Hay dos maneras de hacer esto. El System.Diagnostics.StackTrace()
le dará un seguimiento de pila para el hilo actual. Si tiene una referencia a una instancia de Thread
, puede obtener el seguimiento de la pila a través de la versión sobrecargada de StackTrace()
.
También puede consultar la pregunta sobre el desbordamiento de pila ¿ Cómo obtener el seguimiento de pila del subproceso no actual? .
También puede hacer esto en el depurador de Visual Studio sin modificar el código.
- Cree un punto de interrupción donde desee ver el seguimiento de la pila.
- Haga clic con el botón derecho en el punto de interrupción y seleccione "Acciones ..." en VS2015. En VS2010, seleccione "Al golpear ...", luego habilite "Imprimir un mensaje".
- Asegúrese de que "Continuar ejecución" está seleccionado.
- Escriba algún texto que le gustaría imprimir.
- Agregue $ CALLSTACK donde quiera que desee ver el seguimiento de la pila.
- Ejecuta el programa en el depurador.
Por supuesto, esto no ayuda si está ejecutando el código en una máquina diferente, pero puede ser muy útil poder escupir un seguimiento de la pila automáticamente sin afectar el código de la versión o sin necesidad de reiniciar el programa.
Una alternativa a System.Diagnostics.StackTrace
es usar System.Environment.StackTrace que devuelve una representación de cadena del stacktrace.
Otra opción útil es usar las variables de depuración $CALLER
y $CALLSTACK
en Visual Studio, ya que esto se puede habilitar en tiempo de ejecución sin reconstruir la aplicación.
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]);
}
}
Parece funcionar para mi