2009-10-26 2 views
1

Mon objectif ici est d'obtenir des informations de trace de pile à partir d'un assemblage chargé dynamiquement. Si l'assembly chargé dynamiquement renvoie simplement l'erreur à l'appelant, les informations de trace de la pile ne vous indiquent pas l'emplacement dans l'assembly dynamique où l'erreur s'est produite. Si je lance ma propre exception, en passant l'exception originale, elle sera ajoutée en tant qu'exception interne et aura l'information nécessaire. J'essaie d'éviter de changer tous mes assemblages dynamiques pour lancer de nouvelles exceptions. Est-ce que quelqu'un sait un meilleur moyen d'obtenir les informations de trace de pile à partir d'un assembly chargé dynamiquement?Obtention d'informations de trace de pile à partir d'un chargement dynamique

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 
+0

J'ai changé Throw Ex en Throw et j'ai reçu les mêmes résultats. J'ai également enlevé l'exception de la prise et reçu les mêmes résultats. Il semble que la trace de la pile soit réinitialisée, mais je ne sais pas pourquoi? – Bedwell

+0

Cet exemple est similaire à du code que nous avons en production. Lorsqu'une erreur est générée, elle est enregistrée dans un service Web. Nous examinons donc l'erreur. Si une erreur est générée à partir d'un plug-in (nous en avons environ 200), je ne sais pas quel plug-in a généré l'erreur. Remarque: le plug-in n'enregistre pas l'erreur, la fonction appelant le plug-in gère celle-ci dans une zone centrale. – Bedwell

Répondre

2

Pouvez-vous voir ce qui se passe si vous jetez juste, pas Jeter ex? De mémoire, "throw ex" fait une copie tandis que "throw" renvoie réellement l'exception interceptée. Je suppose que votre "lancer ex" réinitialise efficacement la trace de la pile à votre code local. Si vous réécrivez des exceptions, ajoutez-y une valeur en l'enveloppant dans une nouvelle exception, sinon vous ne devriez pas vous préoccuper de try/catch dans votre exemple.

0

Avez-vous les symboles de débogage pour ces DLL externes? Si vous regardez la trace de pile, et qu'il lit "code externe", cela devrait être développé dans la pile de DLL si vous avez les symboles de débogage de DLL chargés pendant le débogage, puisque les symboles fourniront à votre débogueur l'information nécessaire pour marcher la pile . Vous pouvez le faire en chargeant manuellement les symboles, via la fenêtre Modules dans le menu Déboguer, ou en exécutant une version de débogage de la DLL.

Questions connexes