12 Stimmen

Wie kann ich den Compiler anweisen, eine Methode in Stack Traces zu ignorieren?

Gibt es irgendwelche Attribute, die ich auf Boilerplate-Methoden anwenden kann, damit solche Methoden nicht in Stack Traces erscheinen? Ich habe eine Menge davon, und in einigen Fällen sind sie mehrere Ebenen tief. Das bringt nur Unordnung in die Sache.

Beispiel-Code:

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

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

        }
    }
}

Dies führt zu dieser Stapelverfolgung:

bei Spork.Program.ThrowMe() in C:\Projects\XXX\Testing Sandkasten \ConsoleTesting\Program.cs :Zeile 58

at Spork.Program.HideMe() in C:\Projects\XXX\Testing Sandkasten \ConsoleTesting \Program.cs :Zeile 64

at Spork.Program.Main(String[] args) in C:\Projects\XXX\Testing Sandkasten \ConsoleTesting\Program.cs :Zeile 70

9voto

Hans Passant Punkte 894572

Fügen Sie Console.WriteLine(e) in den Catch-Block ein. Wechseln Sie zum Release-Build und drücken Sie Strg+F5. Sie werden dies sehen:

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 

Beachten Sie, dass die Methode HideMe() no in der Stapelverfolgung sichtbar. Mission erfüllt.

Der Methodenaufruf wurde im Trace nicht angezeigt, weil der JIT-Optimierer hat die Methode : Dies ist die einzige Möglichkeit, Methoden im Stacktrace zu verstecken.

Es ist nicht etwas, das man gut kontrollieren kann, die Methode muss "klein" sein und darf selbst keine Ausnahme auslösen. Dies wird sonst normalerweise als Problem und nicht als Merkmal betrachtet. Es ist schwierig, herauszufinden, wie man von A nach B kommt.

6voto

vc 74 Punkte 36002

Sie können die DebuggerHiddenAttribute

0voto

StriplingWarrior Punkte 141402

Wenn Ihre Methode nicht einfach genug ist, um automatisch eingefügt zu werden, können Sie dem Compiler einen deutlichen Hinweis darauf geben, dass Sie dies mit der Option [MethodImpl(MethodImplOptions.AggressiveInlining)] Attribut.

Sie müssen immer noch im Release-Modus kompilieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X