Bonjour

La fonction ci dessous m'a permis de remonter les adresses des fonctions
appelantes dans un programme C (en gros, la pile contient à chaque fois le
registre ebp et l'adresse de retour, et le registre ebp contient l'adresse du
«ebp» de l'appel précédent. J'ignore si il existe une méthode plus efficace et
si c'est celle utilisé par gdb dans le backtrace. Par contre, pour un
programme 64 bits,  cette méthode ne fonctionne plus, 

Quelqu'un voit-il une méthode pour faire cela?

(Je sais c'est HS mais peut être certains seront intéressés, j'ai regardé les
sources de gdb pour voir leur méthode mais c'est décourageant...)

long int get_pile(int n)
{
  long unsigned int *pile;
  long unsigned int *oldpile;
  asm("movl %%ebp,%0" : "=l" (pile));
  for (;(n>0) && (pile != 0);n--) {
    oldpile=*((long int *) (pile));
    pile = oldpile;
  }
  if (pile != 0)
    return(*((long int *) (pile +1)));
  else return(0);
}

pile(n) renvoit l'adresse du nième «parent» de la fonction.

François Boisson 

-- 
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers [email protected]
En cas de soucis, contactez EN ANGLAIS [email protected]
Archive: 
http://lists.debian.org/[email protected]

Répondre à