Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 从动态加载的堆栈获取堆栈跟踪信息_Vb.net_Exception Handling - Fatal编程技术网

Vb.net 从动态加载的堆栈获取堆栈跟踪信息

Vb.net 从动态加载的堆栈获取堆栈跟踪信息,vb.net,exception-handling,Vb.net,Exception Handling,我的目标是从动态加载的程序集获取堆栈跟踪信息。如果动态加载的程序集只是将错误抛出回调用方,则堆栈跟踪信息不会告诉您动态程序集中发生错误的位置。如果我抛出自己的异常,传入原始异常,它将作为内部异常添加,并具有所需的信息。我试图避免更改所有动态程序集以引发新异常。有人知道从动态加载的程序集中获取堆栈跟踪信息的更好方法吗 Public Class ErrorPlugin ' Example Function from plug in DLL Public Function Simple

我的目标是从动态加载的程序集获取堆栈跟踪信息。如果动态加载的程序集只是将错误抛出回调用方,则堆栈跟踪信息不会告诉您动态程序集中发生错误的位置。如果我抛出自己的异常,传入原始异常,它将作为内部异常添加,并具有所需的信息。我试图避免更改所有动态程序集以引发新异常。有人知道从动态加载的程序集中获取堆栈跟踪信息的更好方法吗

Public Class ErrorPlugin
    ' Example Function from plug in DLL
    Public Function SimpleExample() As Double


        Dim RentedUnits As Double = 42
        Dim NumberUnits As Double = 0


        Try

            ' Just need to generate exception
            Return RentedUnits \ NumberUnits

        Catch ex As Exception

            ' Give's me no Stack Trace infomation.
            'Throw

            ' This will give me Stack Trace infomation, 
            ' but requires adjusting all the plugins.
            Throw New Exception("Stop dividing by zero.", ex)

        End Try



    End Function
End Class



Imports System.Reflection
Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click


        Dim rpt As Object
        Dim r As Double

        Try

            rpt = LoadReport("C:\ErrorPlugin\bin\Debug\ErrorPlugin.dll")

            r = rpt.SimpleExample()

        Catch ex As Exception

            MsgBox(ex.Message & vbCrLf & ex.StackTrace)

            If ex.InnerException IsNot Nothing Then
                MsgBox(ex.InnerException.StackTrace)
            End If

        End Try


    End Sub


    Public Function LoadReport(ByVal FileName As String) As Object

        Dim m_ReportAssembly As [Assembly]
        Dim m_ReportClass As Type
        Dim rpt As Object

        Try
            m_ReportAssembly = Assembly.LoadFrom(FileName)
            For Each m_ReportClass In m_ReportAssembly.GetTypes
                If m_ReportClass.Name.ToLower = "ErrorPlugin".ToLower Then
                    rpt = Activator.CreateInstance(m_ReportClass)
                    Exit For
                End If
            Next

            Return rpt

        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Function

End Class

你能看到如果你只是扔,而不是扔,会发生什么吗?从内存中,“throw ex”进行复制,“throw”实际上重新调用捕获的异常。我猜您的“throw-ex”实际上是将堆栈跟踪重置为本地代码


表示如果要重新引用异常,则应通过将其包装到新异常中来为其添加值,否则您最好不要在示例中使用try/catch。

是否有这些外部DLL的调试符号?如果查看堆栈跟踪,它读取“外部代码”,则如果在调试时加载了DLL调试符号,则应将其扩展到DLL堆栈中,因为这些符号将为调试器提供遍历堆栈所需的信息


可以通过“调试”菜单中的“模块”窗口手动加载符号,也可以针对DLL的调试版本运行符号。

我将Throw Ex更改为Throw,并收到相同的结果。我还从插件中删除了异常处理,并收到了相同的结果。它似乎正在重置堆栈跟踪,只是不确定原因?此示例类似于我们在生产中的一些代码,当生成错误时,它会记录到web服务,因此我们检查错误。如果某个插件产生了错误(我们大约有200个),我不知道是哪个插件产生了错误。注意:插件不记录错误,调用插件的函数在一个中心区域处理该错误。