web-dev-qa-db-fra.com

Comment interpréter la sortie "info frame" GDB?

Certains peuvent-ils m'aider à comprendre ceci:

(gdb) info frame
Stack level 0, frame at 0xb75f7390:
 eip = 0x804877f in base::func() (testing.cpp:16); saved eip 0x804869a
 called by frame at 0xb75f73b0
 source language c++.
 Arglist at 0xb75f7388, args: this=0x0
 Locals at 0xb75f7388, Previous frame's sp is 0xb75f7390
 Saved registers:
  ebp at 0xb75f7388, eip at 0xb75f738c

Que signifie "ebp, eip Locals at and Previous's Frame"? S'il vous plaît, expliquez

37
Dew

(gdb) cadre d'information

niveau de pile 0  

  • frame num in backtrace, 0 est le cadre en cours d'exécution, qui croît vers le bas , en cohérence avec la pile. 

cadre à 0xb75f7390

  • adresse mémoire de départ de ce cadre de pile 

eip = 0x804877f dans base :: func () (testing.cpp: 16); eip enregistré 0x804869a

  • eip est le registre de la prochaine instruction à exécuter (également appelé compteur de programme). donc à ce moment, le prochain à exécuter est à "0x804877f", qui est la ligne 16 de testing.cpp. 

  • l’eip enregistré "0x804869a" est appelé "adresse de retour", c’est-à-dire l’instruction à reprendre dans la trame de la pile de l’appelant après son retour de cette pile. Il est placé dans la pile lors de l'instruction "CALL" (conservez-le pour le retour). 

appelé par image à 0xb75f73b0

  • l'adresse du cadre de la pile de l'appelant

langue source c ++

  • quelle langue en usage

Arglist à 0xb75f7388, args: this = 0x0

  • l'adresse de départ des arguments

Les sections locales à 0xb75f7388

adresse des variables locales. 

Le sp de l'image précédente est 0xb75f7390

c’est là que le pointeur de pile de la trame précédente pointe sur (la trame appelante), au moment de l’appel, c’est aussi l’adresse mémoire de départ de la trame de pile appelée. 

Registres sauvegardés: Ce sont les deux adresses de la pile des appels, pour deux registres sauvegardés.

  • ebp at 0xb75f7388 correspond à l'adresse où le registre "ebp" du cadre de pile de l'appelant a été enregistré (veuillez noter qu'il s'agit du registre et non de l'adresse de pile de l'appelant). C'est-à-dire, correspondant à "Push% ebp". "ebp" est le registre généralement considéré comme l'adresse de départ des locales de ce cadre de pile, qui utilise "offset" pour adresser. Dans un autre mot, les opérations des variables locales utilisent toutes ce "ebp". vous verrez quelque chose comme mov -0x4(%ebp), %eax, etc. 

  • eip à l'adresse 0xb75f738c comme indiqué précédemment, mais voici l'adresse de la pile (qui contient la valeur "0x804877f"). 

65
pepero

Pour comprendre ce que signifie "ebp, eip Locals at et Previous Frame", vous devez comprendre la convention d'appel x86 .

Une fois que vous aurez compris comment les cadres sont disposés , tout le reste sera évident.

5
Employed Russian

Je sais que ces questions viennent de ... il y a 8 ans. Mais pour les futurs utilisateurs, j'ai trouvé un aperçu très clair de l'info ici .

Ceci est tiré du lien susmentionné:

info frame
info f

This command prints a verbose description of the selected stack frame, including:

    the address of the frame
    the address of the next frame down (called by this frame)
    the address of the next frame up (caller of this frame)
    the language in which the source code corresponding to this frame is written
    the address of the frame’s arguments
    the address of the frame’s local variables
    the program counter saved in it (the address of execution in the caller frame)
    which registers were saved in the frame 
0
kdo53