我有一个VB.NET 2010 WinForms应用程序,我想包括在堆栈跟踪行号。 我读过以下问题及答案:
如何在应用程序运行时打印出的行号在VB.net
其中提到“你总是需要包括你的代码的PDB文件,其中包含调试在这样的情况下使用的信息”。 在先进的编译器设置我已经试过“生成调试信息”为“只PDB”和“全”为我的发布版本,并确认新的PDB文件在同一目录下的EXE我产生。 然而下面的测试代码对于每个堆栈帧生成的零行号,并且不返回一个文件名:
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是作为可执行相同的路径。
从文档 ,我们在调用构造函数:
堆栈跟踪与调用者的当前线程创建的,并且不包含文件名,行号,或列的信息。
尝试使用:
Dim st As StackTrace = New StackTrace(ex, True)
相反,它使用此构造函数 。 第二个构造参数被描述为:
真正捕捉到的文件名,行数和列数; 否则为false。
这个问题解决了一段时间回来,但我想我会分享最后的工作职能,我已经包括在我的项目最近。 它返回在该点之后的行号和文件名领导到从堆栈跟踪异常的初始异常信息和完整的堆栈跟踪。
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
尝试使用
public StackTrace(Exception e, bool fNeedFileInfo);
构造和设置fNeedFileInfo为真