2009-05-04 10 views
10

Ich spreche über Managed .NET-Code. Wenn wir irgendein Programm ausführen und VS an es anhängen, können wir Parameterwerte für jede Methode im Aufrufstapel sehen. Ich möchte eine Protokollierungslösung erstellen, die die Werte aller Parameter für jede Methode im Call-Stack protokolliert. Eigentlich brauche ich diese Info, falls eine Ausnahme auftritt.Ist es möglich, Parameter Werte für jeden Frame im Call-Stack in erhalten. NET

Ich weiß, dass es mit Profiling API möglich ist. Aber ich frage mich, ist es nur mit verwaltetem Code möglich?

UPDATE: Ok, wahrscheinlich mit reinem .NET ist es unmöglich. Dann kann mit einer Art von nicht verwalteten Code ... der Punkt ist, dies aus der Anwendung selbst zu tun. Eine Anwendung im Ausnahmefall könnte eine Bibliothek aufrufen (möglicherweise nicht verwaltet), die Informationen über Methodenwerte im Aufruf-Stack zurückgibt. Nur Gedanken ...

+1

Beachten Sie, dass Optimierungen, insbesondere im "Freigabe" -Modus, Inlining usw., dazu führen können, dass Informationen nicht im Call-Stack angezeigt werden. Sie sollten sich besser nicht auf diese Art von Informationen verlassen. – Lucero

+1

Sicher, die Logik der App sollte sich nicht auf solche Informationen verlassen. Aber ich spreche nur über Protokollierung für diagnostische Zwecke. – Shrike

+0

Ich habe das verstanden. Wenn Sie jedoch einen Protokollauszug erhalten und keine zuverlässigen Informationen darin haben, ist seine Nützlichkeit nur begrenzt. – Lucero

Antwort

8

Parameterwerte werden nicht in der StackFrame-Instanz gespeichert. Tatsächlich werden sie überhaupt nicht aufgezeichnet/protokolliert, es sei denn, Sie entscheiden sich explizit dafür.

Eine offensichtliche Möglichkeit, diese Werte zu protokollieren, ist die Verwendung von AOP. Es würde sicherlich Kosten verursachen, aber in Verbindung mit einem Protokollierungs-Framework und dem richtigen Protokolllevel könnte es eine Alternative sein. Sie könnten auch auswählen, nur einige Typen/Methoden in Ihrem Basiscode zu instrumentieren, wo eher Ausnahmen ausgelöst werden. Ich würde wahrscheinlich Postsharp für seine statischen Webfähigkeiten wählen, um Log-Aufrufe zu senden.

Wie auch immer, es ist bei weitem nicht eine ideale Lösung, aber ich fürchte, Sie werden nicht viele Optionen haben, wenn Sie in der verwalteten Welt stecken bleiben.

2

Ihre beste Option ist wahrscheinlich, den erforderlichen Trace-Code in die relevanten Methoden einzufügen. Auf diese Weise können Sie bei Bedarf Trace-Listener und Dump-Werte anhängen.

Ich weiß, dass es nicht das ist, wonach Sie fragen, aber es ist eine Möglichkeit, die Daten zu erhalten.

Alternativ können Sie die Anwendung mit WinDbg debuggen. Mit den! Clstack /! Dso-Befehlen können Sie Parameter prüfen und Objekte stapeln.

Verwandte Themen