2011-01-27 16 views
8

Esistono attributi che posso applicare ai metodi di stampa in modo che tali metodi non vengano visualizzati nelle tracce dello stack? Ne ho molti e in alcuni casi hanno diversi livelli di profondità. Sono solo cose ingombranti.Come posso dire al compilatore di ignorare un metodo nelle tracce dello stack?

codice

Esempio:

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

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

     } 
    } 
} 

Questo genera questa analisi dello stack:

a Spork.Program.ThrowMe() in C: \ Projects \ XXX \ Testing Sandbox \ ConsoleTesting \ Program.cs : linea 58

a Spork.Program.HideMe() in C: \ Projects \ XXX \ Testing Sandbox \ ConsoleTesting \ Program.cs: linea 64

a Spork.Program.Main (string [] args) in C: \ Projects \ XXX \ Testing Sandbox \ ConsoleTesting \ Program.cs: linea 70

+10

Quello che stai chiedendo è qualcosa che è conveniente in alcuni casi e un incubo negli altri. Immagina che qualcun altro stia leggendo la tua traccia dello stack e abbia visto che 'Main' ha chiamato' ThrowMe() '. Quindi esaminano 'Main' ma non riescono a vedere dove viene effettuata la chiamata. Inoltre, immagina che 'Main' sia lungo 500 righe, quindi non è così ovvio come il tuo campione. Sono solidale con te ma alla fine questa "caratteristica" verrebbe abusata e la codifica sarebbe un incubo, ecco perché non esiste. –

+0

Un punto eccellente. – Amy

risposta

7

Console Put .WriteLine (e) nel blocco catch. Passare alla versione di rilascio e premere Ctrl + F5. Vedrete questo:

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 

Si noti che il metodo HideMe() è non visibile nella traccia dello stack. Missione compiuta.

La chiamata al metodo non è stata mostrata nella traccia perché l'ottimizzatore JIT ha sottolineato il metodo: questo è l'unico modo per nascondere i metodi nello stack trace.

Non è qualcosa che puoi controllare bene, il metodo deve essere 'piccolo' e non lanciare alcuna eccezione. Questo è normalmente considerato un problema, non una caratteristica. Difficile capire come ottenere il codice dalla A alla B.

5

È possibile utilizzare la DebuggerHiddenAttribute

+5

Ciò impedisce al debugger di interrompere le eccezioni rilevate in quel membro, ma ciò influisce sulla traccia dello stack? – RQDQ

+0

Si scopre che questa risposta era corretta. Hans lo spiega dettagliatamente. – Amy

+1

Questo attributo funziona perfettamente per nascondere i metodi del wrapper dal debugger. Non compaiono nel callstack, entrando in una volontà ti portano invece alla successiva chiamata sotto di essa, che è ciò che volevi vedere comunque non il wrapper. – James

Problemi correlati