我想在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 ++程序员。
无论如何要解决这个问题?感谢。
答案 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对象时使用的大部分文件,方法名称,行号和列信息。