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
(gdb) cadre d'information
niveau de pile 0
cadre à 0xb75f7390
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
langue source c ++
Arglist à 0xb75f7388, args: this = 0x0
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").
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.
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