如何在VB.net中运行应用程序时打印出行号

时间:2011-04-28 11:22:35

标签: .net vb.net debugging stack-trace line-numbers

我想在VB.net应用程序中用行号打印出我的调试消息。 我确实喜欢这个,

Dim st As StackTrace
Dim sf As StackFramee
st = New StackTrace(New StackFrame(True))
sf = st.GetFrame(0)
Console.WriteLine.("Line " & sf.GetFileLineNumber())

我想把代码片段放到一个类中,每当我调用logMsg方法来记录源代码中的行号时我的消息。 但我发现如果我把上面的片段放到一个类中,行号总是相同的,那就是我新的'st'的行。

该函数与C ++中的_ LINE 宏完全相同。其实我是C ++程序员。

无论如何要解决这个问题?感谢。

3 个答案:

答案 0 :(得分:3)

您展示的代码完全符合预期。它打印您捕获堆栈帧的行号。因为您已在不同的类中定义它,所以它打印包含该类的文件的行号。

此处GetFrame方法非常重要。堆栈帧从0开始编号,这是推送的 last 堆栈帧。因此,通过引用第0帧,您将指示运行时打印已推送的 last 堆栈帧的行号。当一个方法调用另一个方法时,会创建一个新的堆栈帧。

相反,您需要以几种重要方式更改方法。首先,您需要获取已推入堆栈的第一个框架。其次,您可能希望接受一个参数,其中包含有关您要响应的异常的信息。尝试重写您的调试方法,看起来像这样:

Public Sub PrintCurrentLine(ByVal ex As Exception)
    Dim st As StackTrace = New StackTrace(ex)
    Dim sf As StackFrame = st.GetFrame(st.FrameCount - 1)
    Console.WriteLine("Line " & sf.GetFileLineNumber())
End Sub

另外请记住,如果您在启用优化的情况下运行代码,则行号等内容可能已更改。您始终需要在代码中包含PDB文件,其中包含在此类情况下使用的调试信息。它将优化的代码映射回原始源。

答案 1 :(得分:2)

在阅读了几个答案后,我找到了以下解决方案,相当于C ++宏 LINE

(New StackTrace(New StackFrame(True))).GetFrame(0).GetFileLineNumber())

可以用作例如:

Console.WriteLine(String.Format("Executed on line# {0}", (New StackTrace(New StackFrame(True))).GetFrame(0).GetFileLineNumber()))

答案 2 :(得分:1)

编译的程序集不会有与之关联的行号。这不是组件的一部分信息。

信息保存在调试符号文件中 - pdb文件。

来自MSDN - StackTrace class

  

StackTrace信息将为Debug构建配置提供最丰富的信息。默认情况下,Debug构建包括调试符号,而Release构建则不包括。调试符号包含构造StackFrame和StackTrace对象时使用的大部分文件,方法名称,行号和列信息。