我有一个VB.NET 2010 Winforms应用程序,我想在堆栈跟踪中包含行号。我已经阅读了以下问题和答案:
how to print out line number during application run in VB.net
其中提到“您始终需要在您的代码中包含PDB文件,其中包含在此类情况下使用的调试信息”。在高级编译器设置下,我尝试将“生成调试信息”作为“pdb-only”和“full”用于我的发布版本,并确认在与我的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与可执行文件处于相同的路径。
答案 0 :(得分: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 :(得分:5)
从你正在调用的构造函数的documentation开始:
StackTrace是使用调用者的当前线程创建的,不包含文件名,行号或列信息。
尝试使用:
Dim st As StackTrace = New StackTrace(ex, True)
相反,它使用this constructor。第二个构造函数参数描述为:
如果捕获文件名,行号和列号,则为true;否则,错误。
答案 2 :(得分:1)
尝试使用
public StackTrace(Exception e, bool fNeedFileInfo);
构造函数并将fNeedFileInfo设置为true