2011-01-27 6 views
8

Czy są jakieś atrybuty, które można zastosować do metod z użyciem zestawu standardowego, aby takie metody nie pojawiały się w śladach stosu? Mam ich dużo, aw niektórych przypadkach są na kilku poziomach. To po prostu zagracające rzeczy.Jak mogę nakazać kompilatorowi zignorowanie metody śledzenia stosu?

Przykład Kod:

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

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

     } 
    } 
} 

ten generuje ten ślad stosu:

w Spork.Program.ThrowMe() C: \ Projects \ xxx \ Badanie Piaskownica \ ConsoleTesting \ Program.cs : linia 58

w Spork.Program.HideMe() c: \ Projects \ xxx \ Badanie Piaskownica \ ConsoleTesting \ Program.cs: linia 64

na Spork.Program.Main (String [] args) w C: \ Projects \ XXX \ Testing Sandbox \ ConsoleTesting \ Program.cs: linia 70

+10

To, o co prosisz, jest wygodne w niektórych przypadkach, a koszmar w innych. Wyobraź sobie, że ktoś inny czytał twój ślad stosu i zobaczył, że 'Main' nazywa się' ThrowMe() '. Następnie badają 'Main', ale nie widzą, gdzie zostało wywołane. Wyobraź sobie, że 'Main' ma 500 linii, więc nie jest tak oczywiste jak twoja próbka. Sympatyzuję z tobą, ale ostatecznie ta "cecha" zostanie nadużyta, a kodowanie będzie koszmarem, dlatego nie istnieje. –

+0

Doskonały punkt. – Amy

Odpowiedz

7

Put Konsola .WriteLine (e) w bloku catch. Przejdź do wersji wydania i naciśnij Ctrl + F5. Zobaczysz to:

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 

Należy zauważyć, że metoda HideMe() jest nie widoczny ślad stosu. Misja zakończona.

Wywołanie metody nie zostało pokazane w śladzie, ponieważ Optymalizator JIT wprowadził metodę: jest to jedyny sposób na ukrycie metod w śledzeniu stosu.

To nie jest coś, co można dobrze kontrolować, metoda musi być "mała" i nie powinna sama wyrzucać żadnego wyjątku. Zwykle uważa się, że jest to problem, a nie funkcja. Trudno wymyślić jak kod dostałem z A do B.

5

Można użyć DebuggerHiddenAttribute

+5

To uniemożliwia debuggerowi złamanie złapanych wyjątków w tym elemencie, ale czy ma to wpływ na śledzenie stosu? – RQDQ

+0

Okazuje się, że ta odpowiedź była prawidłowa. Hans pisze to dokładniej. – Amy

+1

Ten atrybut działa doskonale do ukrywania metod otoki z debuggera. Nie pojawiają się w stelażu, wchodząc do jednego, a zamiast tego przenoszą cię do następnego połączenia pod nim, a to jest to, co chcesz zobaczyć, a nie opakowanie. – James

Powiązane problemy