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 :

Obtenir le nom d'une fonction à partir de son addresse (pointeur fonction)


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut Obtenir le nom d'une fonction à partir de son addresse (pointeur fonction)
    Bonjour à tous,

    J'ai passé quelques heures à essayer de trouver une solution pour obtenir le nom des fonctions à partir de leur pointeur.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void toto()
    {
    }
     
    int main()
    {
    // pointeur de fonction sur toto()
    void (*PtrToto)();
    ptrToto = toto;
    PtrToto();
    }
    Je voudrais grâce à PtrToto (disons que l'adresse mémoire est 0xABCDEF) pourvoir récupérer le vrai nom de la fonction pointée à savoir "toto" sous forme de chaine de caractères.

    Sous Linux, j'ai trouvé des solutions en activant l'option -g pour avoir les symboles de debug. Pour les intéressés, la solution est ici :
    http://stackoverflow.com/questions/3...s-pointer-in-c

    Mais sous Windows, je n'ai trouvé que ce lien :
    http://ivbel.blogspot.fr/2012/02/how...name-from.html

    Le problème est que la fonction SymGetSymFromAddr64 me renvoie toujours l'erreur 487 (Attempt to access invalid address. ).
    Pourtant j'ai bien mis l'option -g de GCC pour inclure les symboles de debug.

    A mon avis, je dois mal appeler la fonction puisque j'ai une erreur de compilation quand je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TRACE_POINTER(myfunction); // macro issue du code du lien ci-haut
    Voilà mon code :
    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
     
    // le code du lien plus haut dont les deux macros
    #define TRACE_POINTER_INIT InitDebug()
    #define TRACE_POINTER(f) TracePointerInfo((DWORD64)(f))
     
    void toto()
    {
     
    }
     
    int main()
    {
        void (*ptrToto)();
     
        TRACE_POINTER_INIT; // INIT OK
     
        ptrToto = toto;
     
        ptrToto(); // appel de la fonction
     
        TRACE_POINTER(ptrToto); // compile pas ici
        TRACE_POINTER((int)ptrToto); // compile mais erreur 487 
     
        return 0;
    }
    L'erreur est :
    main.c|137|attention : transtypage d'un pointeur vers un entier de taille différente [-Wpointer-to-int-cast]
    Et ca vient du cast en DWORD64. Il doit y avoir une perte de précision où je en sais quoi et du coup l’adresse est invalide... Si je force un cast en int ca compile mais la fonction SymGetSymFromAddr64 retourne l'erreur 487.

    Voilà, j'ai rien trouvé sur le net et je suis bien embêté.

    Merci à vous.

    PS : Je travaille sous Windows 7 64 bits.
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Bonjour,

    Si je suis le lien que tu nous donnes, je lis :

    Possible problems and how to fix them:
    1. SymGetSymFromAddr64 fails, last error is 487 (Attempt to access invalid address. ). Answer: most likely debug information is not found. Rebuild the project for Debug.

    2. SymGetSymFromAddr64 fails, last error is 6 (The handle is invalid). Answer: most likely SymInitialize was not called.

    Cela dit, peut-on savoir pourquoi tu cherches à faire cela ?

  3. #3
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut
    J'ai bien inclus les symboles de Debug (option -g de GCC) et je suis bien en Debug...

    Je cherche à faire un profiler "à la main" afin de mesurer entre autre le temps d’exécution des fonctions.
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  4. #4
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Citation Envoyé par Aspic Voir le message
    J'ai bien inclus les symboles de Debug (option -g de GCC) et je suis bien en Debug...

    Je cherche à faire un profiler "à la main" afin de mesurer entre autre le temps d’exécution des fonctions.
    Salut,

    cela pourrait (je n'en suis pas certain du tout) provenir du fait que gcc avec l'option -g ne génère pas les info de debuging au bon format. En fait il existe différents formats (COFF,XCOFF,DWARF,DWARF2,PDB, sans doute bien d'autres). L'API que tu utilises (DbgHelp) doit utiliser le format PDB (propriétaire microsoft?) alors que l'option -g doit insérer un autre format. Tu peux dire à gcc de changer le format des info de debug mais PDB n'est pas dispo. En lisant en diagonale sur le net il se peut que DbgHelp accepte le COFF ... ça vaut le coup d'essayer avec l'option -gcoff ou -gxcoff.

    références : MSDN (vieux), les options debug de gcc.

    Quelle est ta chaîne de compilation ?

  5. #5
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut
    Salut,

    C'est une bonne remarque, oui dbghelp est utilisé à la base sous Visual Studio et les fichiers de symboles sont bien des PDB.

    J'ai du faire une manipulation sur ce lien pour générer une librairie .a compatible GCC à partir d'un fichier lib (provenant de VS) :
    http://stackoverflow.com/questions/1...ltool-of-mingw

    La commande que j'ai faite est :
    dlltool -k -d libdbghelp.def -l dbghelp.a
    Après, pour l'instant, j'utilise CodeBlocks avec MinGW en rajoutant les options de compilation à la main pour faire mes tests.
    J'ai testé avec -gcoff mais même résultat.

    Je me demande si c'est pas simplement le cast qui plante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TRACE_POINTER((int)ptrToto);
    Après tout la fonction attend un DWORD64 et non un INT.
    Et sans le cast, ca compile pas.
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  6. #6
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut
    Après quelques heures de recherche, je n'ai trouvé que cela :
    http://mingw32dbghelp.sourceforge.net/

    Apparemment on pourrait recompiler dbghelp pour l'utiliser avec GCC et utiliser les symboles dwarf2 pour faire ce que je veux mais je n'arrive pas à compiler la librairie

    Si quelqu'un pouvait essayer de me compiler la librairie et de me donner les binaires, ca serait cool (fichiers .a, .dll).

    Bon pour ce soir, je laisse tomber les recherches...

    PS : le code ci-haut fonctionne sous Visual Studio avec des fichiers PDB, ca m'étonne pas c'est une API à la Microsoft bien propriétaire

    Bonne soirée
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

Discussions similaires

  1. Réponses: 4
    Dernier message: 21/04/2015, 10h45
  2. Réponses: 4
    Dernier message: 21/04/2011, 08h31
  3. Réponses: 4
    Dernier message: 30/10/2007, 21h03
  4. [xslt][xpath]Obtenir le nom du jour a partir d'une date
    Par Thomus38 dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 10/09/2007, 11h49
  5. Réponses: 6
    Dernier message: 06/04/2007, 21h20

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