Frage

Ich möchte drucken Sie meine debug-Nachricht mit der Zeilennummer im VB.net Anwendung.Ich mochte dieses,

Dim st As StackTrace
Dim sf As StackFramee
st = New StackTrace(New StackFrame(True))
sf = st.GetFrame(0)
Console.WriteLine.("Line " & sf.GetFileLineNumber())

I wanna setzen Sie das snippet in eine Klasse, everytime I call logMsg-Methode melden Sie meine Botschaft mit der Zeilennummer im Quellcode.Aber ich fand, wenn ich das snippet oben in eine Klasse, die Nummer der Zeile war immer gleich, das ist die Linie, die ich neu 'st'.

Die Funktion ist genau die gleiche mit _LINE makro in C++.Eigentlich bin ich C++ - Programmierer.

Trotzdem, um dieses problem zu beheben?vielen Dank.

War es hilfreich?

Lösung

Der code, den Sie gezeigt haben, funktioniert genau wie erwartet.Es ist das drucken die Nummer der Zeile, wo Sie erfasst den stack-frame.Denn Sie definiert haben, müssen Sie es in einer anderen Klasse, es ist Druck der Zeilennummer der Datei, die enthält die Klasse.

Die GetFrame Methode ist hier wichtig.Stack-frames sind durchnummeriert, beginnend bei 0, die ist die letzten stack-frame geschoben.So, indem Sie auf frame 0, Sie sind die Laufzeitumgebung anweisen, drucken Sie die Zeile Anzahl der letzten stack-Frames, die gedrückt wurde.Wenn eine Methode ruft eine andere, eine neue stack-frame erstellt wird.

Stattdessen, Sie brauchen, um Ihre Methode in ein paar wichtige Möglichkeiten.Erste, Sie brauchen, um den erste Rahmen, die auf dem Stapel abgelegt.Und zweitens, werden Sie wahrscheinlich wollen, zu akzeptieren, ein parameter, der Informationen über die Ausnahme, dass Sie reagieren.Versuchen Sie umschreiben Ihre debug-Methode so Aussehen:

Public Sub PrintCurrentLine(ByVal ex As Exception)
    Dim st As StackTrace = New StackTrace(ex)
    Dim sf As StackFrame = st.GetFrame(st.FrameCount - 1)
    Console.WriteLine("Line " & sf.GetFileLineNumber())
End Sub

Denken Sie auch daran, dass, wenn Sie den code mit aktivierter Optimierung, Dinge wie Zeilennummern geändert haben können.Sie müssen immer gehören die PDB-Datei mit Ihrem code, enthält die debugging-Informationen, dass ist verwendet in Situationen wie dieser.Es ordnet den optimierten code zurück zu Ihrer ursprünglichen Quelle.

Andere Tipps

Nachdem ich die verschiedenen Antworten gelesen hatte, kam ich für mich zu der folgenden Lösung, die dem C ++ - Makro entspricht LINIE

(New StackTrace(New StackFrame(True))).GetFrame(0).GetFileLineNumber())

die zum Beispiel verwendet werden können als:

Console.WriteLine(String.Format("Executed on line# {0}", (New StackTrace(New StackFrame(True))).GetFrame(0).GetFileLineNumber()))

Die zusammengestellten Baugruppen sind nicht mit Zeilennummern verbunden. Dies sind keine Informationen, die Teil der Baugruppen sind.

Die Informationen werden in der Debugging -Symbole -Datei aufbewahrt - die pdb Datei.

Von msdn - Stacktrace -Klasse:

Stacktrace -Informationen sind mit Debug -Build -Konfigurationen am informativsten. Standardmäßig enthalten Debug -Builds Debug -Symbole, während Release -Builds dies nicht tun. Die Debug -Symbole enthalten den größten Teil der Datei-, Methodennamen-, Zeilennummer- und Spalteninformationen, die beim Erstellen von Stackframe- und Stacktrace -Objekten verwendet werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top