Je suis nouveau à GDB, alors j'ai une question;
comment puis-je regarder le contenu de la pile? ex: pour voir le contenu du registre, je tape info registers
. Pour empiler ce qui devrait être
comment puis-je voir le contenu de $0x4(%esp)
? Quand je tape print /d $0x4(%esp)
gdb donne une erreur.
plate-forme: linux gdb
info frame
pour afficher les informations sur le cadre de la pile
Pour lire la mémoire à des adresses données, vous devriez jeter un oeil à x
x/x $esp
pour hex x/d $esp
pour signé x/u $esp
pour unsigned etc. x utilise la syntaxe de format, vous pouvez également consulter l’instruction en cours via x/i $eip
etc.
Utilisation:
bt
- backtrace: affiche les fonctions de pile et les argumentsinfo frame
- affiche les pointeurs de début/fin/argument/localx/100x $sp
- affiche la mémoire de la pile(gdb) bt # 0 zzz () à zzz.c: 96 # 1 0xf7d39cba dans yyy (arg = arg @ entry = 0x0) à aaa.c: 542 # 2 0xf7d3a4f6 in yyyinit () à aaa.c: 590 # 3 0x0804ac0c dans gnninit () à gnn.c: 374 # 4 principal (argc = 1, argv = 0xffffd5e4) à gnn.c: 389 (Gdb) info frame Niveau de pile 0, frame à 0xffeac770: Eip = 0x8049047 dans la partie principale (goo. c: 291); Saved eip 0xf7f1fea1 langue source c. Arglist à 0xffeac768, args: argc = 1, argv = 0xffffd5e4 Locaux à 0xffeac768, la trame précédente est sp. 0xffeac770 a été enregistrée. enregistre: ebx à 0xffeac75c, ebp à 0xffeac768, esi à 0xffeac760, edi à 0xffeac764, eip à 0xffeac76c (gdb) x/10x $ sp 0xffeac. : 0xf7d39cba 0xf7d3c0d8 0xf7d3c21b 0x00000001 0xffeac64c: 0xf78d133f 0xffeac6f4 0xf7a14450 0xffeac678 0xffeac65c: 0xffeac65c: 0x00000000 0xf7d3790e
Vous devez utiliser les commandes d'affichage de la mémoire de gdb. La base est x
, pour examiner . Il y a un exemple sur la page liée à qui utilise
gdb> x/4xw $sp
imprimer "quatre mots (w
) de la mémoire au-dessus du pointeur de la pile (ici, $sp
) en hexadécimal (x
) ". La citation est légèrement paraphrasée.