我有一个 VB.NET 2010 Winforms 应用程序,我想在堆栈跟踪中包含行号。我已阅读以下问题和答案:
如何在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 与可执行文件位于同一路径中。
这个问题已经解决了一段时间,但我想我应该分享我最近在我的项目中包含的最终工作功能。它返回初始异常信息和该点的完整堆栈跟踪,后跟堆栈跟踪中导致异常的行号和文件名。
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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)