2012-12-27 69 views
9

我有一個VB.NET 2010 Winforms應用程序,我想在堆棧跟蹤中包含行號。我讀過以下問題及答案:在堆棧跟蹤中獲取VB.NET行號

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

,其中提到「你總是需要包括你的代碼,其中包含調試在這樣的情況下使用的信息PDB文件」。在高級編譯器設置下,我嘗試了「生成調試信息」作爲我的發行版本中的「僅限pdb」和「完整」,並確認在我的EXE的同一目錄中生成了新的PDB文件。但是下面的測試代碼生成的零線數每個堆棧幀,並且不返回文件名:

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

但是下面的代碼,因此它似乎沒有它產生一個本來很好看的堆棧跟蹤後直要與一般的異常處理的一個問題:

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

我似乎無法找到項目的配置下的任何其他可能的設置,並想知道是否有人對可能會導致此問題的其他東西的想法。我發現在這裏和其他地方搜索的所有解決方案似乎都建議確保PDB與可執行文件位於同一路徑中。

回答

5

從你調用構造函數的documentation

堆棧跟蹤與調用者的當前線程創建的,並且不包含文件名,行號,或列的信息。

嘗試使用:

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

相反,它使用this constructor。第二個構造函數的參數描述如下:

true爲捕獲文件名,行號和列號;否則,是錯誤的。

1

嘗試使用

public StackTrace(Exception e, bool fNeedFileInfo); 

構造和設置fNeedFileInfo爲true

12

這個問題解決了一段時間回來,但我想我會分享我已經包括最後的工作職能在我的項目最近。它返回初始的異常信息和完整的堆棧跟蹤,然後是堆棧跟蹤中導致異常的行號和文件名。

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

這太棒了。感謝張貼:) – CrazyTim