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

C++ Discussion :

catch segfault avec g++


Sujet :

C++

  1. #1
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 618
    Par défaut catch segfault avec g++
    Salut à tous,

    J'aimerais savoir s'il existe un option sur g++ pour "thrower" une exception en cas de segfault, à la manière de \EHa pour visual ?

    J'utilise une lib qui a la fâcheuse tendance à écrire là où elle ne devrait pas et pour limiter la casse, j'enferme les appels à cette lib dans un gros try catch(...).

    Je ne peux pas utiliser de signaux et j'aimerai avoir le moins de différences entre le code windows et le code linux, c'est pourquoi une option de compil serait la bien venu

    Merci.

  2. #2
    Membre éprouvé Avatar de Nhaps
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2011
    Messages : 350
    Par défaut
    Je ne voie pas l’intérêt de faire un try/catch sur une erreur de segmentation.

    Quel librairie utilises tu ?

  3. #3
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 618
    Par défaut
    L'intérêt est d'éviter de faire planter toute l'appli à cause d'un module secondaire qui a foiré. La lib s'appelle SMlib, c'est une lib de calcul géométrique.

  4. #4
    Membre éprouvé Avatar de Nhaps
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2011
    Messages : 350
    Par défaut
    Je voulais dire par la, qu'il faut la corriger en la trouvant avec l'aide d'un debuggeur et ensuite tu la corriges en conséquence.

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Citation Envoyé par Tooxx Voir le message
    Je voulais dire par la, qu'il faut la corriger en la trouvant avec l'aide d'un debuggeur et ensuite tu la corriges en conséquence.
    Ce n'est pas forcément possible si la lib ne lui appartient pas, ce qui doit être le cas.

  6. #6
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 618
    Par défaut
    Citation Envoyé par jblecanard Voir le message
    Ce n'est pas forcément possible si la lib ne lui appartient pas, ce qui doit être le cas.
    Tout à fait. Et je me vois pas dire à l'utilisateur "Nan mais mon code il fonctionne, c'est la lib qui crash"

  7. #7
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 618
    Par défaut
    Apparemment ce n'est pas possible pour le moment. Y'a bien l'option -fobjc-exceptions, mais c'est pour de l'objectiveC.

    Pour ceux que ça intéresse, ils peuvent chercher SEH (Structured Exception Handling) sur google. Il existe des moyens plus ou moins crade de gérer ça sous linux mais tous basé sur des signaux.

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    J'y pense que maintenant... t'as étudié les terminate handler de la STL ?

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Il est possible de détourner le comportement par défaut des différents signaux (fonction signal).
    Ceci dit, par défaut il est interdit de lever une exception à ce moment, mais c'est également contournable via une option du compilateur : -fnon-call-exceptions

    Ça peut donner ça:
    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
    #include <iostream>
    #include <signal.h>
     
    void catch_segv(int sig) {
      signal(SIGSEGV, catch_segv);
      throw strsignal(sig);
    }
     
    int main() {
      signal(SIGSEGV, catch_segv);
     
      int *e=new (int[3]);
      int *p=e;
      int *p1=e+1;
      int *p2=e-1300;
     
      try {
        *p2=4;
      } catch( char* msg ) {
        std::cout << "Catched: " << msg << std::endl;
      }
    }

  10. #10
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 618
    Par défaut
    @jblecanard
    Je ne connaissais pas les terminate handler, d'après ce que j'ai compris, ça s'applique uniquement lorsqu'une exception n'est pas catché, ça marche aussi pour un segfault ?

    @Nudger
    J'avais vu ce genre de méthodes mais le problème d'un signal est qu'on ne peut le redéfinir qu'une fois. Et comme je ne sais pas si ce signal est, ou sera, utilisé par quelqu'un d'autre, je peux pas me permettre de l'utiliser

    Merci pour votre aide mais le code a été intégré, donc plus de modif, sauf si demande explicite d'un utilisateur

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par jblecanard Voir le message
    Ce n'est pas forcément possible si la lib ne lui appartient pas, ce qui doit être le cas.
    La bibliothèque a son code source ouvert. Il a donc la possibilité de savoir d'où vient l'erreur, et de la signaler au développeur de la bibliothèque.

  12. #12
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Citation Envoyé par oodini Voir le message
    La bibliothèque a son code source ouvert. Il a donc la possibilité de savoir d'où vient l'erreur, et de la signaler au développeur de la bibliothèque.
    Quand tu as des délais, tu ne peux pas attendre que l'éditeur sorte un bug fix de son chapeau. Par contre, tu peux patcher toi même le code de la lib avant de l'envoyer chez le client. Pas génial mais ça dépanne.

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Oui, c'est ce que je voulais dire (de manière un peu elliptique, je le confesse).

Discussions similaires

  1. segfault avec winSNMP
    Par GEII83 dans le forum Bibliothèques
    Réponses: 3
    Dernier message: 27/05/2011, 16h17
  2. [Python API 2.3] Segfault avec PyInt_FromLong
    Par efficks dans le forum Interfaçage autre langage
    Réponses: 2
    Dernier message: 26/06/2008, 15h02
  3. [Python API 2.3] Segfault avec PyInt_FromLong
    Par efficks dans le forum Bibliothèques
    Réponses: 0
    Dernier message: 26/06/2008, 00h37
  4. [C#] Difficulté avec les catch
    Par Roach- dans le forum ASP.NET
    Réponses: 9
    Dernier message: 31/01/2006, 17h57

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