[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[HS]backtrace amd64



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 


Reply to: