我想在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 ++中的宏。实际上我是C ++程序员。

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

有帮助吗?

解决方案

您显示的代码正与预期完全合作。它正在打印您捕获堆栈框架的线路数。因为您已经在另一个类中定义了它,所以它正在打印包含该类的文件的行号。

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

其他提示

阅读了几个答案后,我为我提供了以下解决方案,等同于C ++宏 线

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

例如:

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

编译的组件将没有与之关联的线号。这不是大会一部分的信息。

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

来自MSDN- StackTrace类:

通过调试构建配置,StackTrace信息将最有用。默认情况下,调试构建包括调试符号,而发行版则不包括调试符号。调试符号包含用于构造StackFrame和StackTrace对象的大多数文件,方法名称,行号和列信息。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top