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:
- Le minidump est-il toujours la bonne façon de faire du post-mortem debugging d’une managed application ?
- 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 ?
- 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.
- 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/