2012-03-26 17 views
1

Ich möchte wissen, ob es sicher ist, den folgenden Code zu verwenden, um den Namen (und möglicherweise weitere Informationen) über die Methode oder das Objekt zu ermitteln der aktuelle Ausführung von Code:Ist es sicher, die StackTrace-Klasse zu verwenden, um den Aufrufer der aktuellen Methode zu finden?

StackTrace stackTrace = new StackTrace();   // get call stack 
StackFrame[] stackFrames = stackTrace.GetFrames(); // get method calls (frames) 

insbesondere ist es spezielle/Ecke Fälle, in denen die Frames zugreifen würden Ausnahmen nicht funktionieren oder werfen?

Ich habe in the MSDN page of StackTrace gesucht, aber keine Hinweise auf mögliche Probleme gefunden.

+2

Der Stacktrace identifiziert nicht, wo Sie waren, es zeigt Ihnen, wohin Sie als nächstes gehen. – asawyer

+0

Sorry für Offtopic, aber ich liebe die Idee, in eine rekursive Schleife zu gelangen, die Stack-Trace-Fehler innerhalb des Stack-Trace-Handling-Codes identifiziert. – KingCronus

+0

@asawyer, das ist unmöglich, wie kann es das wissen? –

Antwort

3

Die Methoden können vom Compiler inlined sein und bieten eine andere Ansicht als die, die Sie von einem direkten Blick auf den Code erwarten. Sie können ein Attribut verwenden, um sicherzustellen, dass Ihre Methode nicht inlined ist:

[MethodImpl(MethodImplOptions.NoInlining)] 
public void MyMethod() { 
    // Get the stack trace. 
} 

Andernfalls, wenn MyMethod wird das Stack-Trace inlined nicht den Rahmen für MyMethod enthält, die Ihr Code auf abhängen.

+0

Dies ist möglicherweise noch nicht 100% sicher ==> http://www.hanselman.com/blog/ReleaseISNOTDebug64bitOptimizationsAndCMethodInliningInReleaseBuildCallStacks.aspx – sotto