2012-12-27 15 views
9

Ho un'applicazione VB.NET 2010 Winforms in cui vorrei includere i numeri di riga nello stack trace. Ho letto la seguente domanda e risponde:Come ottenere i numeri di linea VB.NET nello stack trace

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

che cita "è sempre necessario includere il file PDB con il codice, che contiene le informazioni di debug che viene utilizzato in situazioni come questa". Nelle impostazioni avanzate del compilatore ho provato "Genera informazioni di debug" come "pdb-only" e "full" per la mia versione di release e ho confermato che un nuovo file PDB viene generato nella stessa directory del mio EXE. Tuttavia il seguente codice di prova genera un numero di linea pari a zero per ogni stack frame e non restituisce un nome di file:

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

Tuttavia il seguente codice subito dopo che genera un altrimenti bello traccia dello stack in modo non sembra ad essere un problema con il gestore di eccezioni in generale:

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

io non riesco a trovare tutte le altre impostazioni probabilmente sotto la configurazione di progetto e si è chiesto se qualcuno aveva idee su altre cose che possono causare questo problema. Tutte le soluzioni che ho trovato cercando qui e altrove sembrano suggerire che il PDB si trovi nello stesso percorso dell'eseguibile.

risposta

5

Dal documentation del costruttore si sta chiamando:

Lo StackTrace è creato con thread corrente del chiamante, e non contiene il nome del file, il numero di riga, o le informazioni di colonna.

Provare a utilizzare:

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

invece, che utilizza this constructor. Il secondo parametro costruttore è descritto come:

true per acquisire il nome del file, il numero di riga e il numero di colonna; altrimenti, falso.

1

provare a utilizzare il

public StackTrace(Exception e, bool fNeedFileInfo); 

Constructor e l'impostazione fNeedFileInfo true

12

Questa domanda è stato risolto qualche tempo fa, ma ho pensato di condividere la funzione di lavoro finale che ho includo nei miei progetti di recente. Restituisce le informazioni di eccezione iniziali e la traccia di stack completo in quel punto, seguita dai numeri di riga e dai nomi di file che portano all'eccezione dalla traccia dello stack.

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

Questo è fantastico. Grazie per aver postato :) – CrazyTim