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 :

exception renvoie l'arbre d'appel des fonctions


Sujet :

C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 4
    Points : 4
    Points
    4
    Par défaut exception renvoie l'arbre d'appel des fonctions
    Bonjour,
    j'écris une petite bibliothèque C++ et je voudrais que lorsque j'ai des erreurs que j'ai détecté (dimension d'un tableau négative ...),
    je voudrais renvoyer l'arbre d'appel des fonctions. c'est_à-dire si on F1(F2(F3(x)), si on a une erreur dans F3, le message d'erreur soit du type
    Error in function f1 : Function f2 : function f3 : invalid argument".
    J'utilise le méchanisme d'exception mais je suis débutant.
    J'ulitise throw et try/catch pour concatener des string ensemble et renvoyer une nouvelle erreur
    malheureusement, je ne sais pas comment savoir quel est la fonction appelé la "plus haute",
    c'est-à-dire savoir si je dois traiter l'erreur ou la renvoyer a la fonction appelante si il y en a une.

    Cordialement,

  2. #2
    Membre confirmé
    Avatar de Captain'Flam
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2011
    Messages : 273
    Points : 455
    Points
    455
    Billets dans le blog
    1
    Par défaut
    Malheureusement, en C++, il n'y a aucun moyen standard de récupérer la "callstack" (pile d'appels).
    Mais selon les environnements, tu peux trouver des fonctions non-standards qui permettent de faire ça.
    Si tu travailles avec gcc, tu peux utiliser backtrace.
    Avec Visual Studio, il y a StackWalk (un peu compliquée).
    Dans tous les cas, tout bon moteur de recherche à qui tu demandes "c++ get call stack" te trouvera une foultitude de solutions.

    Mais quoi que tu trouves, je te suggère (fortement) de créer une fonction avec des paramètres bien standards et de l'implémenter dans un fichier c++ à part.
    Dedans tu pourras faire les #include nécessaires sans "polluer" le reste du code.
    Et ça te permettra de circonscrire les "zones non-standard" de ton projet.
    Captain'Flam
    anciennement Sopsag, aka Hadrien
    Win seven x64 & Win 10 / Visual 2017 / Python 2.7 / Eclipse

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 073
    Points : 12 119
    Points
    12 119
    Par défaut
    je voudrais renvoyer l'arbre d'appel des fonctions. c'est_à-dire si on F1(F2(F3(x)), si on a une erreur dans F3, le message d'erreur soit du type
    Error in function f1 : Function f2 : function f3 : invalid argument".
    Juste remarque à 2 balles, là, la séquence d'appel, c'est F3 puis F2 puis F1, il n'y pas de F1+F2+F2 dans la stack d'appel à un aucun moment.

    >le Titre du post
    Remarque à 2balles bis, arbre d'appel et pile d'appel sont des choses complètement différentes.
    La pile d'appel est contient les adresses de retour des fonctions appelantes.
    L'arbre d'appel est la liste des fonctions susceptible d'appeler une fonction ou la liste des fonctions appelables par une fonction (en fonction d'un arbre ascendant ou descendant).

    Si c'est pour simplifier le débugging, les débogueurs sont capables de faire des choses bien meilleurs que ce que vous pouvez faire avec de simple trace.

    Si c'est pour des rapports de problèmes sur le terrain (production), il est bien plus simple et efficace de partir sur une architecture qui utilise un dumper mémoire automatique + fichier des symboles + un watchdog.

    En clair, c'est ne STRICTEMENT RIEN FAIRE, pas de try, pas de catch, pas de copier/coller de nom de méthode, RIEN, NADA, QUE TCHI.

    L'astuce ?
    Sous Windows et sous xNIX, on peut configurer l'OS pour qu'il génère un dump de la mémoire si un programme par en sucette.
    Avec le dump mémoire et les symboles de l'exécutable, un compilateur post-mortem indique précisément où c'est parti en sucette et vous avez accès à toute la mémoire de l'exécutable au moment du crash.
    Mais pour ça, il ne faut pas catcher tout et n'importe quoi et il faut utiliser correctement les capsules RAII pour fermer l'application en bon ordre.
    Le watchdog est là pour relancer l'application qui a planté.

    Ce genre d’infrastructure est donné clé en main sous Windows avec des outils type AutoDumpPlus (ADPlus).
    https://msdn.microsoft.com/en-us/lib...or=-2147217396

  4. #4
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 391
    Points
    11 391
    Billets dans le blog
    11
    Par défaut
    Et sinon, c'est quand même possible de le faire, mais en C, et pas portable.
    En API Win32, il y a les fonctions SymInitialize et SymFromAddr qui te permettront de récupérer la pile d'appel.
    Sous Linux, il y a les fonctions backtrace et backtrace_symbols, qui font le même travail.
    Sous Mac, j'en sais rien, mais je soupçonne que backtrace et backtrace_symbols doivent fonctionner.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 073
    Points : 12 119
    Points
    12 119
    Par défaut
    En API Win32, il y a les fonctions SymInitialize et SymFromAddr qui te permettront de récupérer la pile d'appel.
    Pour que ces appels fonctionnent, il faut que les symboles soient disponible sur la machine d'exécution, c'est très moyen pour un environnement de prod, et je crois qu'il faut que des Dll uniquement distribuées avec le Redistrubution-Kit de Debug.

    Je ne vois pas pourquoi vous voulez vous obstiner à faire du boulot en plus.

  6. #6
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 391
    Points
    11 391
    Billets dans le blog
    11
    Par défaut
    Citation Envoyé par bacelar Voir le message
    ... je crois qu'il faut que des Dll uniquement distribuées avec le Redistrubution-Kit de Debug...
    Je suis tout à fait d'accord, et ça ne sert qu'à ça.
    Je ne m'en sers que pour connaître les piles d'appel d'allocation des objets que je traque, ce que je ne suis pas sûr d'avoir avec un crash dump.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 073
    Points : 12 119
    Points
    12 119
    Par défaut
    , ce que je ne suis pas sûr d'avoir avec un crash dump
    Why ???

  8. #8
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 391
    Points
    11 391
    Billets dans le blog
    11
    Par défaut
    Ben en tout cas avec un .dmp pour Visual Studio, je ne l'ai pas.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 073
    Points : 12 119
    Points
    12 119
    Par défaut
    Moi, pour les dump, j'utilise WinDbg mais je crois que VS sait les lire depuis un bon bout de temps.

Discussions similaires

  1. Générer un arbre d'appel des fonctions
    Par droledenom dans le forum MATLAB
    Réponses: 1
    Dernier message: 02/07/2011, 17h34
  2. Comment appeler des fonctions C# sous Excel
    Par ttttnht dans le forum Windows Forms
    Réponses: 1
    Dernier message: 12/09/2006, 16h49
  3. appel des fonctions d'un driver dans un programme en c
    Par richie25 dans le forum Windows
    Réponses: 5
    Dernier message: 10/01/2006, 08h27
  4. Réponses: 6
    Dernier message: 30/09/2005, 00h53
  5. Appel à des fonctions incluses dans des DLL
    Par Greybird dans le forum Langage
    Réponses: 3
    Dernier message: 26/05/2003, 13h33

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