Bonjour à tous,
J'ai passé quelques heures à essayer de trouver une solution pour obtenir le nom des fonctions à partir de leur pointeur.
Exemple :
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 :
TRACE_POINTER(myfunction); // macro issue du code du lien ci-haut
Voilà mon code :
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.
Partager