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

Python Discussion :

tracer la hierarchie des appels


Sujet :

Python

  1. #1
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut tracer la hierarchie des appels
    Bonjour,
    J'ai une application complexe en python (2.4.2). Je debugge actuellement un problème et dans ce cadre je voudrais connaitre la hierarchie des appels successifs pour arriver jusqu'à une méthode donnée : un peu ce qui est fourni par python lorsque qu'il y a une erreur détectée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Traceback (most recent call last):
      File "./HMI/nedi.py", line 557, in ?
        nedi = Application__(userPreferenceFile, maintenance, db['user'], db['password'], db['simulation'], watchdog, test_mode)
      File "./HMI/nedi.py", line 99, in __init__
        self.database = DataBase__(self.user, password, simulation)
      File "/ipas2/user/awalter/ccm_wa/NEDI-ACE2011A_prep/NEDI/DataInterface/database.py", line 340, in __init__
        self.ctx = self.DataBaseGet_Context()
      File "/ipas2/user/awalter/ccm_wa/NEDI-ACE2011A_prep/NEDI/DataInterface/database.py", line 1139, in DataBaseGet_Context
        errmsg = self.DataBaseExecute(sqlcmd)
      File "/ipas2/user/awalter/ccm_wa/NEDI-ACE2011A_prep/NEDI/DataInterface/database.py", line 1426, in DataBaseExecute
        a=b
    Sauf que moi je n'ai pas d'erreur et je ne peux pas en provoquer dans ma méthode car elle est appelée plusieurs fois jusqu'au moment ou ça m'interresse.
    Merci

  2. #2
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    Quelques print() bien placés ne suffisent pas ?

    Sinon, jette un œil aux modules trace et traceback :
    http://docs.python.org/release/2.6.6...l#module-trace
    http://docs.python.org/release/2.6.6...dule-traceback

    (liens vers la doc 2.6, la 2.4 ne semble plus dispo… mais je ne crois pas que ça ait beaucoup bougé…)

  3. #3
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 484
    Points : 9 286
    Points
    9 286
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Sur Python 2.4, il y a un module traceback qui semble faire ce que tu cherches (mais je ne sais pas m'en servir):

    doc de Python 2.4: http://docs.python.org/release/2.4/

    Module traceback: http://docs.python.org/release/2.4/l...traceback.html

    Tyrtamos

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 428
    Points : 37 010
    Points
    37 010
    Par défaut
    Salut,

    Vous pouvez utiliser le module "trace" dont vous trouverez des exemples chez D.Hellman

    Le souci est peut être que ce n'est peut être pas "tunable" pour réduire les objets tracés. Il existe pour cela pas mal de jouets basés sur les decorators tel que celui décrit ici

    Il y a aussi des méthode basées sur pdb et gdb que je n'ai pas eu le besoin d'utiliser jusqu'à présent.

    - W

  5. #5
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 484
    Points : 9 286
    Points
    9 286
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Je ne sais pas si ça suffira, mais j'utilise de temps en temps un décorateur tout simple qui affiche l'entrée et la sortie de la fonction décorée lorsqu'elle est appelée.

    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
    #! /usr/bin/python
    # -*- coding: utf-8 -*-
    from __future__ import division
    # Python v2.7
     
    import functools
     
    #############################################################################
    def decolog(fonc):
        """décorateur pour afficher l'entrée et la sortie de la fonction décorée"""
        @functools.wraps(fonc)
        def _appelfonc(*args, **kwargs):
            print u"entrée dans ", fonc.__name__
            result = fonc(*args, **kwargs)
            print u"sortie de ", fonc.__name__
            return result
        return _appelfonc
     
    #############################################################################
    @decolog
    def fonc1():
        fonc2()
     
    @decolog
    def fonc2():
        fonc3()
     
    @decolog
    def fonc3():
        pass
     
    #############################################################################
    fonc1()
    Ce qui affiche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    entrée dans  fonc1
    entrée dans  fonc2
    entrée dans  fonc3
    sortie de  fonc3
    sortie de  fonc2
    sortie de  fonc1
    Il suffit de mettre le décorateur juste avant chaque fonction que l'on veut tracer

    On peut faire une variante avec un décorateur qui écrit un fichier log sur disque. Dis-moi si ça t'intéresse.

    Tyrtamos

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 428
    Points : 37 010
    Points
    37 010
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    On peut faire une variante avec un décorateur qui écrit un fichier log sur disque. Dis-moi si ça t'intéresse.
    Pourquoi refaire plutôt que d'apprendre à se servir ce qui est déjà fait?
    - W

  7. #7
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 484
    Points : 9 286
    Points
    9 286
    Billets dans le blog
    6
    Par défaut
    Bonjour wiztricks,

    Citation Envoyé par wiztricks Voir le message
    Pourquoi refaire plutôt que d'apprendre à se servir ce qui est déjà fait?
    Parce que c'est très amusant et qu'on apprend ainsi des tas de choses...

    Par ailleurs, ma solution est extrêmement simple, et que je l'écris plus rapidement que je ne comprends la doc en anglais.

    Tyrtamos

  8. #8
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    Avec beaucoup de retard dans ma réponse, le module traceback fait ce que j'attendais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print traceback.print_stack()
    merci beaucoup

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Outils][C#/API Tapi] Y a-t-il une gestion du nombre des appels ?
    Par andreaslecousin dans le forum EDI/Outils
    Réponses: 7
    Dernier message: 16/03/2007, 16h08
  2. Faire des appels de variables
    Par paco69 dans le forum Linux
    Réponses: 10
    Dernier message: 28/07/2006, 12h29
  3. Réponses: 6
    Dernier message: 02/07/2006, 11h02
  4. Réponses: 2
    Dernier message: 20/03/2006, 10h39
  5. []Augmenter la taille de la pile des appels ?
    Par oncle ervil dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 10/05/2005, 10h29

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