Articles tagués “assert

Empêcher l’ouverture d’une pop-up quand un programme Windows plante

Par défaut, quand votre programme C ou C++ plante sous Windows, une pop-up s’ouvre pour vous l’annoncer. Ça donne quelque chose comme ceci (avec mingw-w64 dans Eclipse) :

C’est sympa, mais ça peut poser des problèmes. En particulier, cela implique que votre programme continue de s’exécuter jusqu’à ce que quelqu’un clique sur le bouton « Fermer le programme« . Et ce quelqu’un n’arrivera peut-être jamais… C’est notamment le cas quand votre application crashe sur votre serveur d’intégration continue. L’application ne fait rien mais ne s’arrête pas sans que l’outil d’intégration continue ne puisse faire quoique ce soit (en fait, il ne le sait même pas), à part finir par faire un abort de la construction quand le timeout aura été atteint (si vous en avez configurer un…).

La solution est très simple, il suffit de rajouter une petite ligne au début de votre main() (en ayant bien sûr inclus le bon fichier d’en-tête) :

#include  <windows.h>

int main() {
    SetErrorMode (SEM_FAILCRITICALERRORS |
          SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);

    // Votre programme

Votre programme s’arrêtera et le code de retour vous montera que le programme a planté :

Ça fonctionne aussi quand une exception n’est pas catchée ou quand votre programme rencontre un assert() qui échoue !

Pour plus de détails sur la fonction SetErrorMode():

  • sa documentation sur MSDN (vous y lirez ce magnifique commentaire : « Best practice is that all applications call the process-wide SetErrorMode function with a parameter of SEM_FAILCRITICALERRORS at startup. This is to prevent error mode dialogs from hanging the application. » =)
  • son implémentation dans mingw64

Concevoir un site comme celui-ci avec WordPress.com
Commencer