2011-01-27 15 views
8

¿Hay algún atributo que pueda aplicar a los métodos repetitivos para que esos métodos no aparezcan en los rastros de pila? Tengo muchos de ellos y en algunos casos tienen varios niveles de profundidad. Es solo cosas abarrotadas.¿Cómo puedo decirle al compilador que ignore un método en los rastros de pila?

código

Ejemplo:

class Program 
{ 
    public static void ThrowMe() 
    { 
     throw new NotImplementedException(); 
    } 

    public static void HideMe() 
    { 
     ThrowMe(); 
    } 
    static void Main(string[] args) 
    { 
     try 
     { 
      HideMe(); 
     } 
     catch (Exception e) 
     { 

     } 
    } 
} 

Esto arroja este seguimiento de la pila:

en Spork.Program.ThrowMe() en C: \ Projects \ XXX \ Testing Sandbox \ ConsoleTesting \ Program.cs : línea 58

en Spork.Program.HideMe() en C: \ Projects \ XXX \ Testing Sandbox \ ConsoleTesting \ Program.cs: línea 64

en Spork.Program.Main (args String []) en C: \ Projects \ XXX \ Pruebas de recinto de seguridad \ ConsoleTesting \ Program.cs: Línea 70

+10

Lo que está pidiendo es algo que es conveniente en algunos casos y una pesadilla en otros. Imagina que alguien más estaba leyendo tu rastro de pila y vio ese 'Main' llamado' ThrowMe() '. Luego investigan 'Main' pero no pueden ver dónde se realiza esa llamada. Además, imagina que "Main" tiene 500 líneas, por lo que no es tan obvio como tu muestra. Me solidarizo contigo, pero en última instancia esta "característica" sería abusada y la codificación sería una pesadilla, por eso no existe. –

+0

Un excelente punto. – Amy

Respuesta

7

consola de Ponga .WriteLine (e) en el bloque catch. Cambie a la compilación de lanzamiento y presione Ctrl + F5. Usted verá esto:

System.NotImplementedException: The method or operation is not implemented. 
    at ConsoleApplication1.Program.ThrowMe() in C:\Users\hpassant\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs:line 9 
    at ConsoleApplication1.Program.Main(String[] args) in C:\Users\hpassant\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs:line 17 

Tenga en cuenta que el método HideMe() es no visible en el seguimiento de la pila. Misión cumplida.

La llamada al método no se mostró en la traza porque el optimizador JIT marcó el método: esta es la única forma de ocultar los métodos en el seguimiento de la pila.

No es algo que pueda controlar bien, el método tiene que ser 'pequeño' y no arrojar ninguna excepción. Esto normalmente se considera un problema, no una característica. Difícil descubrir cómo se obtuvo el código de A a B.

5

Usted puede utilizar el DebuggerHiddenAttribute

+5

Eso evita que el depurador rompa las excepciones detectadas en ese miembro, pero ¿eso afecta el seguimiento de la pila? – RQDQ

+0

Resulta que esta respuesta fue correcta. Hans lo explica con más detalle. – Amy

+1

Este atributo funciona maravillosamente para ocultar métodos de contenedor desde el depurador. No aparecen en la pila de llamadas, entrando en una en su lugar lo llevará a la siguiente llamada debajo de la misma, que es lo que quería ver de todos modos, no la envoltura. – James

Cuestiones relacionadas