在堆栈跟踪中获取VB.NET行号

Pet*_*erJ 9 stack-trace winforms vb.net-2010

我有一个VB.NET 2010 Winforms应用程序,我想在堆栈跟踪中包含行号.我读过以下问题和答案:

如何在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
Run Code Online (Sandbox Code Playgroud)

但是下面的代码直接生成一个看起来很好看的堆栈跟踪,所以它似乎不是一般的异常处理程序的问题:

ExceptionDetails.Text = ex.GetType.ToString & "(0x" & hr.ToString("X8") & "): " & ex.Message & vbCrLf & ex.StackTrace
Run Code Online (Sandbox Code Playgroud)

我似乎无法在项目配置下找到任何其他可能的设置,并想知道是否有人对可能导致此问题的其他事情有想法.我在这里和其他地方找到的所有解决方案似乎都建议确保PDB与可执行文件处于相同的路径中.

Pet*_*erJ 13

这个问题在一段时间后得到了解决,但我想我会分享我最近在项目中包含的最终工作功能.它返回初始异常信息和完整堆栈跟踪,然后是行号和文件名,从而导致堆栈跟踪中的异常.

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
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 5

从你正在调用的构造函数的文档:

StackTrace是使用调用者的当前线程创建的,不包含文件名,行号或列信息.

尝试使用:

Dim st As StackTrace = New StackTrace(ex, True)
Run Code Online (Sandbox Code Playgroud)

相反,它使用这个构造函数.第二个构造函数参数描述为:

如果为true,则捕获文件名,行号和列号; 否则,错误.