redgate a un Outil de rapport d'erreur qui dit qu'il peut p>
"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. " p> blockQuote>
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. P>
Quelqu'un a-t-il des idées? P>
8 Réponses :
Les variables locales sont stockées sur la pile (de la même manière que les paramètres sont). P>
Sauf quand ils ne sont pas. Les variables locales et les paramètres sont souvent enregistrés.
Eh bien, dit-il les variables locales em>? 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. P>
Ayant dit que, je suppose qu'ils pourraient em> 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. P>
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. P>
Avez-vous essayé le produit pour vous-même? Pourriez-vous vous lier à cela? P>
Une autre citation: "Mais ce rapport d'exception détaillé est plus qu'une simple trace de pile: elle vous fournit les valeurs de toutes les variables impliquées dans l'appel d'échec." ( Red-gate.com/Products/smartassembly/.../a>)
@Consultutatah: Ce n'est pas vraiment clair des captures d'écran ce qu'ils veulent dire. Pourquoi ne pas simplement attraper l'essai gratuit et voir?
Juste vérifié. Il obtient les valeurs des paramètres et des locaux. J'ai compris comment maintenant et ne l'aime pas vraiment. Je posterai la réponse dans une minute.
@Consultutatah: cool. Vous voudrez peut-être également mentionner si des modifications apportées aux paramètres sont également présentées ...
@Consultutatah ~ Heureux de voir que vous êtes toujours kickin '! Cela fait longtemps que celui-ci, je sais, mais cette astuce est un mystère de longue date. Avez-vous déjà publié votre solution quelque part? "J'ai compris comment maintenant" code>
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 em> sur l'état de votre programme lorsqu'il s'est écrasé. P>
Je ne sais pas comment redgate le fait, mais Visual Studio 2010 a introduit une nouvelle fonctionnalité appelée IntelliTrace qui fait quelque chose de similiaire ...... Peut-être que c'est basé sur cela? P>
Ils ne parlent pas d'une exception manutention em> mais à propos de quelque chose qui intercède au point une exception est jeté em>. p>
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 p>
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. P>
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;
}
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.