locked
Rapport de crash d'application .NET RRS feed

  • Question

  • Bonjour,

    Dans le cadre de la distribution d'une application auprès de clients de notre entreprise, je souhaite intégrer un outil qui permette, en cas de crash de l'application, d'analyser et comprendre ce qui a ou provoquer le crash.

    Par crash, j'entends un crash total de l'application, de façon inattendue et sans que l'exception ne puisse être traitée. Cela peut survenir dans plusieurs cas.

    Cela m'est déjà arrive par le passé, malgré des handlers sur les exceptions non gérées, et j'étais parvenu à débuguer grâce aux "Microsoft debugging tools".
    A présent, l'application va être commercialisée et je ne peux plus utiliser cette technique. Je voudrais, en cas de crash, qu'un rapport soit généré, de la même façon que le rapport d'erreurs qu'on peut envoyer à Microsoft lors de crashes d'applications. Ensuite je voudrais pouvoir analyser ce rapport pour comprendre la cause du crash.

    Le hic, c'est que je n'ai pas trouvé de technique qui me permette de le faire, c'est pourquoi je sollicite votre aide sur ce forum.

    Je vous remercie d'avance !

    Cordialement, MS.
    mercredi 30 juin 2010 20:27

Réponses

  • Bonjour,

    Si il n'est pas possible de "catcher" cette exception, il vous faudra utiliser les services de Windows prévu à cet effet. Par exemple la fonctionnalité "Rapports et solutions" sous Vista. Ou le DrWatson sous XP.

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS Windows Forms - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    • Marqué comme réponse Alex Petrescu vendredi 2 juillet 2010 11:16
    jeudi 1 juillet 2010 21:39
  • Bonjour,

    Non, si votre application plante suite au déclenchement d'une exception critique (OutOfMemoryException est un très bon exemple), il n'est pas plus possible d'executer du code .NET... (Car l'environnement du CLR est automatiquement défaillant).

    C'est donc au niveau de Windows de récupérer cet incident...

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS Windows Forms - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    vendredi 2 juillet 2010 07:38

Toutes les réponses

  • Bonjour,

    Le plus simple est de faire un try/catch global au niveau de votre application. Dans le catch, vous générez un message d'erreur complet sur l'incident de programme (StackTrace, capture d'écran...etc) et vous l'envoyez par e-mail.

    Quel genre d'application souhaitez vous surveiller ?

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS Windows Forms - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    mercredi 30 juin 2010 20:47
  • Bonjour Gilles et merci pour le conseil.

    Ceci est déjà fait, ainsi que d'autres techniques, pour catcher les exceptions. Mais dans le développement d'applications, il arrive qu'on ne puisse pas catcher certaines exceptions, car elles sont critiques. Dans ce cas, windows ferme l'application. Et c'est ce genre de cas que je veux pouvoir traiter. Tous les autres cas sont déjà traités, je reçois un email avec un rapport sur l'exception.

     

    Voyez le thread suivant : http://social.msdn.microsoft.com/Forums/fr-FR/clr/thread/104d085d-a862-44bd-af73-67085b0f78b4

     

    Il traite d'un cas qui crashe l'application. C'est un cas que j'ai eu il y a quelque temps et que j'ai réussi à résoudre grâce à des outils externes (Microsoft Debugging Tools). Mon application est une application Win32.

    jeudi 1 juillet 2010 08:50
  • Bonjour,

    Quelle exception critique souhaitez vous récupérer particulièrement ?

    Le plus souvent si votre application plante et ne déclenche pas d'exception, cela vient du fait que le CLR est défaillante (donc tout code .NET sur votre application ne pourra pas être executé). Dans ce cas il faudra trouver des outils au niveau Windows afin de tracer votre application.

    Le plus souvent les plantages d'application qui font planter le CLR sont dûs à des problèmes d'environnement (antivirus parano, ...etc) et non de l'application...

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS Windows Forms - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    jeudi 1 juillet 2010 09:16
  • Dans mon cas, c'était du à une exception qui était générée par une DLL de windows (mshtml.dll) dans un context de multithread. Ce n'était pas une défaillance de la CLR. Cependant, le fait que mshtml.dll se crashe faisait crasher l'application, car elle était dans un état instable, ce qui est le comportement voulu par Microsoft. C'est ce genre de cas que je voudrais traiter.
    jeudi 1 juillet 2010 09:24
  • Bonjour,

    Si il n'est pas possible de "catcher" cette exception, il vous faudra utiliser les services de Windows prévu à cet effet. Par exemple la fonctionnalité "Rapports et solutions" sous Vista. Ou le DrWatson sous XP.

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS Windows Forms - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    • Marqué comme réponse Alex Petrescu vendredi 2 juillet 2010 11:16
    jeudi 1 juillet 2010 21:39
  • Bonjour, 

     

    Mais n'y a-t-il pas une solution intégrable dans le code ? Par exemple une DLL qui permettrait de générer un rapport, plutôt que d'utiliser des outils externes. Ainsi je pourrai demander aux utilisateurs de m'envoyer les rapports.

    vendredi 2 juillet 2010 07:25
  • Bonjour,

    Non, si votre application plante suite au déclenchement d'une exception critique (OutOfMemoryException est un très bon exemple), il n'est pas plus possible d'executer du code .NET... (Car l'environnement du CLR est automatiquement défaillant).

    C'est donc au niveau de Windows de récupérer cet incident...

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS Windows Forms - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    vendredi 2 juillet 2010 07:38
  • Merci beaucoup pour ces éclaircissements !

     

    Je ne connais pas l'outil Dr. Watson. Je vais me plonger un peu dedans pour essayer de comprendre.

     

    Cordialement.

     

    Matteo

    mardi 6 juillet 2010 08:51