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个),我不知道是哪个插件产生了错误。注意:插件不记录错误,调用插件的函数在一个中心区域处理该错误。