11
votes

Valeurs des variables locales en C # Après exception?

redgate a un Outil de rapport d'erreur qui dit qu'il peut

"Obtenez un état complet de votre programme quand il s'est écrasé (pas seulement la pile trace), y compris les valeurs de variables lorsque l'accident s'est passé - sans avoir à aller d'avant en arrière conversations d'e-mail inefficaces avec l'utilisateur final. "

J'ai construit un outil de reporting d'exception non géré nos applications, mais je ne peux pas imaginer comment ils obtiennent plus que des informations de trace de pile dans le code de production.

Quelqu'un a-t-il des idées?


0 commentaires

8 Réponses :


-2
votes

Les variables locales sont stockées sur la pile (de la même manière que les paramètres sont).


1 commentaires

Sauf quand ils ne sont pas. Les variables locales et les paramètres sont souvent enregistrés.



5
votes

Eh bien, dit-il les variables locales ? Cela ne le dit pas dans la pièce que vous avez citée. Je soupçonne qu'il fait un dépotoir de tas et vous permet d'examiner les variables statiques et d'instance.

Ayant dit que, je suppose qu'ils pourraient installer une sorte de gestionnaire d'erreurs global (il y a des filtres d'exception qui exécutent même avant de capter ou enfin des blocs) qui accrochent le contenu de la pile à l'aide du code natif. Cela pourrait donner accès aux variables locales.

Fondamentalement, si elle parvient à saisir la pile avant que cela ne soit déroulé (cependant ils le font), ils peuvent obtenir à vos variables locales. Si le code redgate ne s'implique que lorsque cela devient au niveau supérieur, je soupçonne que ce ne serait que des valeurs de tas.

Avez-vous essayé le produit pour vous-même? Pourriez-vous vous lier à cela?



0
votes

Ils prennent probablement une dépotoir de crash, qui inclut l'ensemble de la mémoire du programme et de toutes les valeurs du registre, ainsi qu'une quantité généreuse de métadonnées. Cela vous permet vraiment de récupérer tout sur l'état de votre programme lorsqu'il s'est écrasé.


0 commentaires


2
votes

Ils ne parlent pas d'une exception manutention mais à propos de quelque chose qui intercède au point une exception est jeté .


0 commentaires

0
votes

Il n'est pas possible avec un code géré pur. Vous pouvez faire cela en utilisant API de débogage. Peut-être que cela aide http://msdn.microsoft.com /en-us/library/bb384652(vs.90).aspx


0 commentaires

0
votes

Je ne connais pas les détails, mais Microsoft fournit des API de débogage et une DLL de débogage spécial appelée SOS pour les programmes .NET. Redgate peut-être utilise des API de débogage pour inspecter les variables locales et autres "racines". Il pourrait utiliser théoriquement des API de débogage pour capturer l'état de tous les objets existant au moment où une exception / un crash est détectée pour être non gérée.


0 commentaires

17
votes

Il semble que ce qu'ils font, c'est qu'ils réécrivent votre montage et ajoutent un bloc d'essai / attraper dans chaque méthode (sauf ceux que vous excluez spécifiquement). La capture obtient la valeur de toutes les variables locales. Donc, si j'avais le code:

private int Add(int o1, int o2) {
  int ret = 0;
  try {
    ret = o1+o2;
  }
  catch (Exception e) {
    SpecialExceptionHandler.HandleException(e, new object[]{o1, o2});
  }
  return ret;
}


2 commentaires

C'est vraiment très bien. Je pense que ce mécanisme doit être en quelque sorte construire dans .NET, éventuellement par des attributs facultatifs (post #?).


Les assemblages n'ont pas de noms de variables locaux. Sachant que Var1 était foo et Var2 était la barre n'est pas toujours utile.