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

时间:2012-12-27 00:06:10

标签: winforms stack-trace vb.net-2010

我有一个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与可执行文件处于相同的路径。

3 个答案:

答案 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