2012-12-27 13 views
9

Ich habe eine VB.NET 2010 Winforms-Anwendung, wo ich Zeilennummern in den Stack-Trace einfügen möchten. Ich habe die folgenden Fragen und Antworten lesen:Abrufen von VB.NET-Zeilennummern im Stack-Trace

how to print out line number during application run in VB.net

Welche „Sie müssen immer enthalten die PDB-Datei mit Ihrem Code, der Informationen enthält, die das Debuggen in Situationen wie diese verwendet wird“ erwähnt. Unter den erweiterten Compiler-Einstellungen habe ich versucht, "Debug-Informationen zu erzeugen" als "pdb-only" und "full" für meine Build-Version und bestätigt, dass eine neue PDB-Datei im selben Verzeichnis wie meine EXE generiert wird. Doch der folgende Testcode erzeugt für jeden Stapelrahmen eine Zeilennummer von Null und gibt keinen Dateinamen:

Dim st As StackTrace = New StackTrace(ex) 
    For Each sf As StackFrame In st.GetFrames 
     MsgBox("Line " & sf.GetFileLineNumber() & sf.GetFileName) 
    Next 

jedoch den folgenden Code direkt nach dem es eine ansonsten gut aussehenden Stack-Trace erzeugt, so scheint es nicht, , um ein Problem mit den Exception-Handler im allgemeinen:

ExceptionDetails.Text = ex.GetType.ToString & "(0x" & hr.ToString("X8") & "): " & ex.Message & vbCrLf & ex.StackTrace 

ich kann keine andere wahrscheinlich Einstellungen unter der Projektkonfiguration scheinen zu finden und fragte mich, ob jemand Ideen auf anderen Dinge hatte, die dieses Problem verursachen kann. Alle Lösungen, die ich hier und anderswo gefunden habe, scheinen nur darauf hinzuweisen, dass die PDB dem Pfad der ausführbaren Datei entspricht.

Antwort

5

Vom documentation des Konstrukteurs Sie anrufen:

Der Stacktrace mit dem Anrufer aktuellem Thread erstellt wird, und der Dateinamen, Zeilennummer, oder Spalteninformationen nicht enthalten.

Versuchen Sie es mit:

Dim st As StackTrace = New StackTrace(ex, True) 

statt, die this constructor verwendet. Der zweite Konstruktorparameter wird wie folgt beschrieben:

true, um den Dateinamen, die Zeilennummer und die Spaltennummer zu erfassen; sonst falsch.

1

Versuchen Sie, die

public StackTrace(Exception e, bool fNeedFileInfo); 

Constructor und Einstellung fNeedFileInfo auf true

12

Diese Frage vor einiger Zeit wurde mit gelöst, aber ich dachte, ich würde die endgültige Arbeits Funktion teilen, die ich einschließlich habe in meinen Projekten kürzlich. Es gibt die anfängliche Ausnahmebedingung und den vollständigen Stack-Trace an diesem Punkt zurück, gefolgt von den Zeilennummern und Dateinamen, die zu der Ausnahme vom Stack-Trace führen.

Public Function GetExceptionInfo(ex As Exception) As String 
    Dim Result As String 
    Dim hr As Integer = Runtime.InteropServices.Marshal.GetHRForException(ex) 
    Result = ex.GetType.ToString & "(0x" & hr.ToString("X8") & "): " & ex.Message & Environment.NewLine & ex.StackTrace & Environment.NewLine 
    Dim st As StackTrace = New StackTrace(ex, True) 
    For Each sf As StackFrame In st.GetFrames 
     If sf.GetFileLineNumber() > 0 Then 
      Result &= "Line:" & sf.GetFileLineNumber() & " Filename: " & IO.Path.GetFileName(sf.GetFileName) & Environment.NewLine 
     End If 
    Next 
    Return Result 
End Function 
+1

Das ist fantastisch. Danke fürs Schreiben :) – CrazyTim