我正在尝试获取行号以创建调试日志,希望通过代码函数调用等更轻松地绘制路径
但是,如果我正确使用 StackTrace,它不会给出我需要的响应:
Private Sub FormAnalyser_Load(sender As Object, e As EventArgs) Handles MyBase.Load
...
If isDebug Then LogDebugCall("analyser.vb", "_queryBuilder.Load()")
_queryBuilder.Load()
...
End Sub
在 Debugger.vb 类中。
Public Shared Sub LogDebugCall(docName As String, callStatement As String)
Debug.Indent()
Debug.Indent()
Debug.Indent()
Dim st As New StackTrace(True)
Dim sf As StackFrame = st.GetFrame(st.FrameCount - 1)
Dim line As String
line = "Line: " & CStr(sf.GetFileLineNumber())
Dim tmp As String
tmp = sf.GetMethod().Name
Debug.WriteLine(callStatement & Space(50 - Len(callStatement)) & "(Call: " & callStatement & " " & docName & " " & line & ")")
...
End sub
因此,尽管 FrameCount 可能是 58 或其他值,但我总是得到 LineNUMber 为 0,这取决于它在什么时候被调用。检查 sf 给出 - sf {ThreadStart at offset 68 in file:line:column :0:0 } System.Diagnostics.StackFrame 并且有一个 OFFSET_UNKNOWN 标志 -1 这里有一个线程显示debug_info 的设置,我还没有完成,但在 VS 社区 2013 中找不到此设置。这是我遇到问题的原因还是我只是使用错误?
因为这仍然没有给我任何有用的东西并且在这里阅读过。我简化了结构,仅用于该方法建议的测试目的,但直接将其移至我的表单类。
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
当没有异常时,异常不适合我想要的所以
Public Sub PrintCurrentLine()
Dim st As StackTrace = New StackTrace(true)
Dim sf As StackFrame = st.GetFrame(st.FrameCount - 1)
Console.WriteLine("Line " & sf.GetFileLineNumber())
End Sub
不工作!在两个实例中都返回值 -1 所以我直接在调用方法中声明了 st,sf 我要捕获其行号并且 sf.GetFileLineNumber() 仍然返回 -1 所以如果其他人有其他东西要扔给我,我会很感激!
多谢你们!