Я новичок в GDB, поэтому у меня есть несколько вопросов:
Как я могу посмотреть содержимое стека? Пример: чтобы увидеть содержимое реестра, я набираю
info registers
. Для стека что это должно быть?Как я могу увидеть содержимое
$0x4(%esp)
? Когда я печатаюprint /d $0x4(%esp)
, GDB выдает ошибку.
Платформа: Linux и GDB
Ответы:
info frame
чтобы показать информацию о кадре стекаЧтобы прочитать память по заданным адресам, вы должны взглянуть на
x
x/x $esp
для шестнадцатеричногоx/d $esp
для подписанногоx/u $esp
для беззнакового и т. д. x использует синтаксис формата, вы также можете посмотреть текущую инструкцию черезx/i $eip
и т. д.источник
Использование:
bt
- backtrace: показать функции стека и аргументыinfo frame
- показать указатели начала / конца / аргументов / локальных переменных стекаx/100x $sp
- показать стековую память(gdb) bt #0 zzz () at zzz.c:96 #1 0xf7d39cba in yyy (arg=arg@entry=0x0) at yyy.c:542 #2 0xf7d3a4f6 in yyyinit () at yyy.c:590 #3 0x0804ac0c in gnninit () at gnn.c:374 #4 main (argc=1, argv=0xffffd5e4) at gnn.c:389 (gdb) info frame Stack level 0, frame at 0xffeac770: eip = 0x8049047 in main (goo.c:291); saved eip 0xf7f1fea1 source language c. Arglist at 0xffeac768, args: argc=1, argv=0xffffd5e4 Locals at 0xffeac768, Previous frame's sp is 0xffeac770 Saved registers: ebx at 0xffeac75c, ebp at 0xffeac768, esi at 0xffeac760, edi at 0xffeac764, eip at 0xffeac76c (gdb) x/10x $sp 0xffeac63c: 0xf7d39cba 0xf7d3c0d8 0xf7d3c21b 0x00000001 0xffeac64c: 0xf78d133f 0xffeac6f4 0xf7a14450 0xffeac678 0xffeac65c: 0x00000000 0xf7d3790e
источник
Вам нужно использовать команды gdb memory-display. Основной -
x
для изучения . На странице, на которую есть ссылка, есть пример, который используетgdb> x/4xw $sp
чтобы вывести «четыре слова (
w
) памяти над указателем стека (здесь$sp
) в шестнадцатеричном формате (x
)». Цитата немного перефразирована.источник