[.NET] Post-mortem debugging

J’ai passé plusieurs heures à chercher sur le net, j’ai trouvé une série d’articles et de devblogs, mais je n’arrive toujours pas à voir la “big picture” comme on dit. Mes questions portent sur le “post-mortem debugging”, c’est à dire quand une application crashe, on enregistre des informations qui vont permettre par la suite de recréer l’état du crash dans un debugger pour comprendre ce qui s’est passé.

Avec une application Win32/C++ “traditionnelle”, y’a le minidump. C’est génial, en quelques lignes on met un exception handler qui génère un petit fichier, qui associé au PDB permet de procéder à l’autopsie. Maintenant, avec une application CLR, ça ne semble plus aussi simple, et en gros je ne sais pas comment faire l’équivalent.

Bon alors, questions:

  1. Le minidump est-il toujours la bonne façon de faire du post-mortem debugging d’une managed application ?
  2. Mon application managed chope toute seule les exception de premier ordre, elle envoie juste un petit message box avec la call stack et hop ça continue. Moi je veux un dump à ce niveau là, que puis-je faire ?
  3. Si je mets un ThreadException handler, et que je minidump, la call stack ne ressemble à rien, même si je chope le exception pointer via marshal. Le exception handler est appelé dans un thread différent ? Dans quelles circonstances est-on sensé appeler Marshal.GetExceptionPointer ? J’ai rien trouvé comme doc là-dessus.
  4. Avec le ThreadExceptionEventArgs, je peux récupérer l’exception, et donc la call stack sous forme de string… Bon c’est déjà ça, mais moi je veux un truc que je peux visualiser dans un debugger, avec les local variables.

En gros, comment dois-je m’y prendre ? C’était si simple en C++/Win32, il doit bien exister quelque chose d’équivalent en managed. Ah oui, j’ai cru comprendre que le minidump ne suffisait pas pour une managed call stack, mais étant donné que c’est juste l’interface dans mon cas, les plantages ne se produisent quasiment que dans la partie qui n’est pas managed… Donc cette partie me suffirait.

Ah oui un dernier truc, qui sort légèrement du topic. Il semble possible de s’interfacer avec Dr Watson pour gérer les core dumps, quel est l’avantage de procéder de la sorte par rapport à du “fait maison” ? Bon, je dois avoir qu’à ce niveau-là j’ai pas encore fait beaucoup de recherches, mais si vous avez un lien intéressant sur Dr Watson sous le coude, ça m’intéresse.

Juste pour info, voici la liste des liens les plus intéressants que j’ai trouvés lors de mes recherches sur le sujet. Ca parle de .NET en général, mais y’a de gros passages sur le debugging dans les archives.

http://dotnetdebug.blogspot.com/
http://blogs.gotdotnet.com/jmstall/
http://blogs.msdn.com/davidklinems/

J’ai lu récemment un article qui parlait du debugging .net où, il me semble, il était question de DrWatson. Je cherche l’article et je mets le lien dès que je le trouve. (Ah oui, c’était sur le programme de microsoft pour accéder aux rapports de bug envoyés par ton appli). Edit : Bon, perdu, c’était juste une entrée de blog sur winqual qui est le top de la crème pour aider au debuggage des applis déployées (mais pas trivial du tout : code signing, lab, certificat verisign, etc.). Donc je m’étais fourvoyé, sorry :stuck_out_tongue:

Je t’avouerai que j’ai cherché un peu moi aussi à l’époque sans finalement aller plus loin que la récupération d’infos, donc je suis aussi intéressé par toute la doc qui peut exister à ce sujet. Ce qu’il me manque c’est plutôt un exemple concret de la procédure à effectuer pour cette gestion des dumps (j’ai l’impression qu’il existe 150 méthodes différentes avec des outils différents qui ne conduisent pas au même résultat).

Quelques liens que je retrouve :

Un article sur CodeProject : « Post-Mortem Debugging Your Application with Minidumps and Visual Studio .NET »
La nouvelle procédure pour que VS2005 télécharge les fichiers de symbole
L’appli pour générer des core dump pour la CLR
Blog de Scott Nonnenberg, PM C# chez MS qui bosse à priori sur le debugging VS

(je complèterai au fur et à mesure)