zum drucken Zeilennummer während der Anwendung führen Sie in VB.net
Möchte ich drucken Sie meine debug-Meldung mit der Zeilennummer im VB.net -Anwendung.
Ich mochte dies,
Dim st As StackTrace
Dim sf As StackFramee
st = New StackTrace(New StackFrame(True))
sf = st.GetFrame(0)
Console.WriteLine.("Line " & sf.GetFileLineNumber())
Ich wollen das snippet zu einer Klasse, jedes mal wenn ich call logMsg-Methode zum anmelden meine Meldung mit der Zeilennummer im source-code.
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 _LINIE makro in C++. Ich bin eigentlich C++ - Programmierer.
Trotzdem, um dieses problem zu beheben? danke.
InformationsquelleAutor CCC | 2011-04-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den code, den Sie gezeigt haben, funktioniert genau wie erwartet. Es ist Druck Nummer der Zeile, wo Sie erfasst den stack frame. Denn Sie definiert haben, müssen Sie es in einer anderen Klasse, es ist Druck-die Nummer der Zeile der Datei enthält die Klasse.
Den
GetFrame
Methode ist hier wichtig. Stack-frames sind durchnummeriert, beginnend bei 0, in der letzten stack-frame geschoben. So, durch die Bezugnahme auf frame 0, Sie sind die Laufzeitumgebung anweisen, drucken Sie die Zeile Anzahl der letzten stack frame, der geschoben wurde. Wenn eine Methode ruft eine andere, ein neuer stack-frame angelegt wird.Stattdessen, Sie brauchen, um Ihre Methode in ein paar wichtige Möglichkeiten. Erste, Sie brauchen, um den ersten Rahmen, die auf dem Stapel abgelegt. Und zweitens, werden Sie wahrscheinlich wollen, zu akzeptieren einen parameter, der Informationen über die Ausnahme, dass Sie reagieren. Versuchen Sie umschreiben Ihre debug-Methode so Aussehen:
Denken Sie auch daran, dass wenn Sie den code mit Optimierungen aktiviert, Dinge wie Zeilennummern geändert haben. Sie immer brauchen, um die PDB-Datei mit Ihrem code, enthält debugging-Informationen, die verwendet wird, in Situationen wie dieser. Es ordnet den optimierten code zurück zu Ihrer ursprünglichen Quelle.
Gut, es ist. Man konnte zu Fuß den gesamten Stapel, auf der Suche nach den individuellen Rahmen, den Sie möchten. Wie ich oben erwähnt, die
GetFrame
Methode ist der Schlüssel, weil es ist, was können Sie tun, dass. Sobald Sie erkennen den richtigen Rahmen, dieGetFileLineNumber
wird genau das tun, was Sie wollen (außer, natürlich, im Release-Modus ohne debug-Informationen verfügbar). Der trick ist immer der richtige stack-frame, da hast du den Aufruf einer anderen Methode zu behandeln Debuggen. Die wichtige Sache zu erinnern ist, dass jeder Aufruf der Methode erzeugt einen neuen stack-frame.Ja, du hast Recht. Der Schlüssel problem ist, wenn eine Anwendung berechnet den frame, das ist GetFrame. Vielen Dank für Ihre Führung.
Ich bin ehrlich gesagt nicht sicher, wie dies unterscheidet sich von C++. Hast du das gleiche problem mit der
_LINE
makro? Wenn Sie den Aufruf einer Methode in einer anderen source-Datei, es wird eine andere Zeilennummer. Sie finden den richtigen Rahmen im Stapel, um die richtige Nummer. Jedenfalls sind Sie willkommen.Cody. In C++ ist es ganz nützlich und viel einfacher, als VB.net. Wir können eine debug-Meldung Zeilennummer und finden Sie schnell, esp embedded-Linux-Umgebung durch die Verwendung von LINIE DATEI und FUNC. Ich bin mit dem system derzeit in meinem anderen Projekt. BTW es ist ein open source log-system genannt, log4cpp. Trotzdem, vielen Dank.
InformationsquelleAutor Cody Gray
Nach dem Lesen der verschiedenen Antworten, kam ich für mich zu folgender Lösung als äquivalent zu der C++ - makro LINIE
die verwendet werden können, zum Beispiel als:
InformationsquelleAutor user2780980
Den kompilierten Assemblys, werden keine Zeilennummern mit Ihnen verbunden. Dies ist nicht Informationen, die Teil der Baugruppen.
Werden die Informationen gehalten, die in den debugging-Symbole-Datei - die
pdb
Datei.Vom MSDN - StackTrace-Klasse:
InformationsquelleAutor Oded