1

我想在 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++ 程序员。

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

4

3 回答 3

3

您显示的代码完全按预期工作。它正在打印您捕获堆栈帧的行号。因为您在不同的类中定义了它,所以它会打印包含该类的文件的行号。

方法在GetFrame这里很重要。堆栈帧从 0 开始编号,这是最后推送的堆栈帧。因此,通过引用第 0 帧,您是在指示运行时打印被推送的最后一个堆栈帧的行号。当一个方法调用另一个方法时,会创建一个新的堆栈帧。

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

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 文件,其中包含在这种情况下使用的调试信息。它将优化的代码映射回您的原始源。

于 2011-04-28T11:29:37.437 回答
3

在阅读了几个答案后,我找到了以下解决方案,相当于 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()))
于 2013-09-15T10:24:44.613 回答
1

已编译的程序集将没有与之关联的行号。这不是程序集的一部分的信息。

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

来自 MSDN - StackTrace 类

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

于 2011-04-28T11:27:38.363 回答