IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

relancer une application après une erreur critique


Sujet :

Windows

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 340
    Points : 177
    Points
    177
    Par défaut relancer une application après une erreur critique
    Je voudrais connaître le moyen usuel pour relancer une application après une erreur critique (comme un segmentation fault. Visual Studio, quand il plante, se relance par exemple). Déjà, pour récupérer l'erreur, j'utilise signal() ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <signal.h>
    
    typedef void (*Es_Signal_Cb)(int);
    
    static void
    _es_signal_cb(int signal)
    {
      if (signal == SIGSEGV)
        {
          printf("access violation\n");
        }
      else if (signal == SIGILL)
        {
          printf("illegal instruction\n");
        }
      else if (signal == SIGFPE)
        {
          printf("floating point error\n");
        }
      else if (signal == SIGABRT)
        {
          printf("abnormal termination\n");
        }
      else
        {
          printf("unexpected signal (%d)\n", signal);
          return;
        }
    }
    
    int main()
    {
      Es_Signal_Cb previous_cb;
    
      /* access violation (SIGSEGV) */
      previous_cb = signal(SIGSEGV, _es_signal_segv_cb);
      if (previous_cb == SIG_ERR)
        {
          printf("can not set up signal handler SIGSEGV (%s)\n", strerror(errno));
          printf("Exiting...\n");
          return -1;
        }
    
      /* illegal instruction (SIGILL) */
      previous_cb = signal(SIGILL, _es_signal_ill_cb);
      if (previous_cb == SIG_ERR)
        {
          printf("can not set up signal handler SIGILL (%s)\n", strerror(errno));
          printf("Exiting...\n");
          return -1;
        }
    
      /* floating point error (SIGFPE) */
      previous_cb = signal(SIGFPE, _es_signal_fpe_cb);
      if (previous_cb == SIG_ERR)
        {
          printf("can not set up signal handler SIGFPE (%s)\n", strerror(errno));
          printf("Exiting...\n");
          return -1;
        }
    
      /* abnormal termination (SIGABRT) */
      previous_cb = signal(SIGABRT, _es_signal_abrt_cb);
      if (previous_cb == SIG_ERR)
        {
          printf("can not set up signal handler SIGABRT (%s)\n", strerror(errno));
          printf("Exiting...\n");
          return -1;
        }
    
      abort();
    
      return 0;
    }
    (abort() est là pour faire un test). Donc il faut que je rajoute du code dans _es_signal_cb() pour relancer l'application. Mais je n'ai pas trop d'idées (je pourrais avec un execvp() relancer l'appli, peut-être)

    Quelqu'un connaît-il le moyen standard pour faire ceci ?

    Merci
    L'Opus attire les Prélats

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Visual se relance parce qu'il y a une case à cocher dans la fenêtre DRWatson qui apparait en cas de crash. Le mieux serait de trouver le moyen de faire apparaître cette case pour ton programme.

    Pour un programme en arrière-plan par contre, le mieux est d'en faire un service, les services peuvent être réglés pour être relancés automatiquement.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 340
    Points : 177
    Points
    177
    Par défaut
    on m'a aussi parlé de l'utilisation des SEH sous XP et d'une fonctionalité apparue sous Vista :

    http://msdn.microsoft.com/fr-fr/visualc/bb870268

    perso, j'aimerais bien savoir comment le faire avec les SEH.
    L'Opus attire les Prélats

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Pour Watson, on m'a répondu: Il faut utiliser la fonction RegisterApplicationRestart().

    Pour le SEH, il empêchera (temporairement) l'application de crasher, mais ne corrigera pas l'erreur et ne relancera pas le programme.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 340
    Points : 177
    Points
    177
    Par défaut
    ok. Donc mon idée d'utiliser signal() pour savoir quelle erreur s'est produite, puis de relancer l'application avec execvp() ou CreateProcess() semble raisonnable.
    L'Opus attire les Prélats

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Sous Windows, RegisterApplicationRestart() est la meilleure solution.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 340
    Points : 177
    Points
    177
    Par défaut
    le problème, pour moi, est que cette fonction n'existe qu'à partir de Vista, or je dois supporter Windows >= XP
    L'Opus attire les Prélats

  8. #8
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 340
    Points : 177
    Points
    177
    Par défaut
    J'ai aussi trouvé ceci sur Codeproject:

    http://www.codeproject.com/KB/except...?display=Print

    Ca m'aidera, je pense (et si ça peut aider d'autres personnes...)
    L'Opus attire les Prélats

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Euh... Là, je ne comprends plus rien. Comment cette fonction peut-elle être Vista-only alors que Visual y arrive sous XP?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 340
    Points : 177
    Points
    177
    Par défaut
    http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

    "Minimum supported client Windows Vista"
    L'Opus attire les Prélats

Discussions similaires

  1. Réponses: 0
    Dernier message: 30/09/2009, 18h42
  2. Exécuter une application après une installation
    Par ideesnoires dans le forum Dreamshield
    Réponses: 1
    Dernier message: 17/06/2009, 20h44
  3. Réponses: 7
    Dernier message: 06/11/2008, 16h38
  4. [Joomla!] passer d'une application locale à une application web sur Joomla
    Par Gabrieel dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 15/05/2008, 18h38
  5. Réponses: 2
    Dernier message: 30/04/2007, 10h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo