欢迎来到飞鸟慕鱼博客,开始您的技术之旅!
当前位置: 首页知识笔记正文

在被调用函数中利用堆栈跟踪确定是被哪个函数调用的

终极管理员 知识笔记 120阅读

代码很简单,如下module module 1 module 1 public subreportsposition()subreportsposition(ByValmsgAsString)DimstraceAsNewStackTrace(True)dimframeasnewstackframe=

style="color: rgba(0, 0, 0, 1)"> strace.GetFrame(1'0表示调用堆栈的最里层(本函数),1表示上一层也就是调用ReportPosition()的函数, 
        MsgBox("错误信息:" & msg & ControlChars.CrLf & "位置:" & frame.ToString)
        
'可以将frame.ToString()的内容保存到文件
        '在trycatch中调用该方法可以方便跟踪异常位置
    End Sub
End Module

    
'调用
    Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button1.Click
        
Try
            
'do something
            Dim i As Int32 = 0
            i 
= 1 / i
        
Catch ex As Exception
            ReportPosition(ex.Message)
        
End Try

    
End Sub

 

不过只有在Debug模式并且有.pdb文件的情况下才能获得调用函数的所在的文件和行号。

刚才看下面的文章想到的
Find out what's closing your application
他的代码如下:

Private Sub Form1_Closing(ByVal sender As Object, _
  
ByVal e As System.ComponentModel.CancelEventArgs) _
  
Handles MyBase.Closing
    
Dim O As System.Diagnostics.StackTrace = _
           
New System.Diagnostics.StackTrace(True)
    
Dim F As System.Diagnostics.StackFrame

    F 
= O.GetFrame(7)

    
Select Case F.GetMethod.Name.ToString
        
Case "SendMessage"
            MsgBox("Closing because of call in code.")
        
Case "CallWindowProc"
            MsgBox("Closing because of system menu click.")
        
Case "DispatchMessageW"
            MsgBox("Closing because of Task Manager.")
        
Case Else
            
MsgBox("Don't Know why I'm closing!!??")
    
End Select
End Sub

标签:
声明:无特别说明,转载请标明本文来源!