Cómo imprimir la Traza de pila actual in.NET ¿sin excepción alguna?


Tengo un código regular de C#. No tengo excepciones. Quiero registrar programáticamente el seguimiento de pila actual para fines de depuración. Ejemplo:

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

5 answers

Echa un vistazo a la System.Diagnostics espacio de nombres. ¡Hay muchas golosinas ahí!

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

Esto es realmente bueno para tener un vistazo alrededor para aprender lo que está pasando bajo el capó.

Le recomiendo que eche un vistazo a las soluciones de registro (como NLog, log4net o la Biblioteca Empresarial de patrones y prácticas de Microsoft) que pueden lograr sus propósitos y algunos más. Buena suerte compañero!

 305
Author: Spence,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-02 04:25:31

Una alternativa a System.Diagnostics.StackTrace es usar el sistema .Ambiente.StackTrace que devuelve una string-representation de la stacktrace.

Otra opción útil es utilizar el $CALLER y $CALLSTACK depuración de variables en Visual Studio ya que esto se puede habilitar en tiempo de ejecución sin necesidad de reconstruir la aplicación.

 178
Author: larsmoa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-07 14:05:42

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 Thread, puede obtener el seguimiento de la pila a través de la versión sobrecargada de StackTrace().

Es posible que también desee revisar Stack Overflow question Cómo obtener stacktrace de hilo no actual?.

 37
Author: Brian Rasmussen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:10:30

También puede hacer esto en el depurador de Visual Studio sin modificar el código.

  1. Cree un punto de interrupción donde desee ver el seguimiento de la pila.
  2. Haga clic con el botón derecho en el punto de interrupción y seleccione "Acciones"..."en VS2015. En VS2010, seleccione " Cuando se pulsa...", luego habilite "Imprimir un mensaje".
  3. Asegúrese de que "Continuar ejecución" está seleccionado.
  4. Escriba un texto que le gustaría imprimir.
  5. Agregue CALL CALLSTACK donde quiera ver el seguimiento de la pila.
  6. Ejecute el programa en el depurador.

Por supuesto, esto no ayuda si está ejecutando el código en una máquina diferente, pero puede ser bastante útil para poder escupir un seguimiento de pila automáticamente sin afectar el código de liberación o sin necesidad de reiniciar el programa.

 11
Author: Hank Schultz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-09 18:19:27
   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 mí

 -1
Author: Jeff Jacobs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-29 18:02:22