Как можно увидеть содержимое стека с помощью GDB
Я новичок в GDB, поэтому у меня есть вопрос;
как посмотреть содержимое стека? пример: чтобы увидеть содержимое реестра, я набираю
info registers
, Для стека, что должно бытькак я могу увидеть содержание
$0x4(%esp)
? Когда я печатаюprint /d $0x4(%esp)
GDB дает ошибку.
платформа: Linux GDB
3 ответа
info frame
показать информацию о кадре стека
Чтобы прочитать память по заданным адресам, вы должны взглянуть на x
x/x $esp
для шестнадцатеричного x/d $esp
для подписи x/u $esp
для unsigned и т. д. x использует синтаксис формата, вы также можете посмотреть текущую инструкцию через x/i $eip
и т.п.
Использование:
1. bt
- backtrace: показать функции стека и аргументы
2. info frame
- показать указатели начала / конца / аргументов / локальных стеков
3. x/100x $sp
- показать стековую память
(gdb) bt #0 zzz () в zzz.c:96 #1 0xf7d39cba в ггг (arg=arg@entry=0x0) в ггг.с:542 #2 0xf7d3a4f6 в гггг () в гггг.с:590 #3 0x0804ac0c в gnninit () в gnn.c:374 #4 main (argc=1, argv=0xffffd5e4) в gnn.c:389 (gdb) информационный кадр Уровень стека 0, кадр в 0xffeac770: eip = 0x8049047 в основном (goo. с:291); сохранен исходный язык eip 0xf7f1fea1 c. Список аргументов в 0xffeac768, арг: ARGC = 1, ARGV = 0xffffd5e4 Местные жители в 0xffeac768, зр предыдущий кадр является 0xffeac770 Сохраненные регистры: EBX на 0xffeac75c, EBP в 0xffeac768, ЭРИ на 0xffeac760, EDI в 0xffeac764, EIP в 0xffeac76c (GDB) х /10x $sp 0xffeac63c: 0xf7d39cba 0xf7d3c0d8 0xf7d3c21b 0x00000001 0xffeac64c: 0xf78d133f 0xffeac6f4 0xf7a14450 0xffeac678 0xffeac65c: 0x00000000 0xf737
Вам нужно использовать команды отображения памяти GDB. Основным является x
, для осмотра. На связанной странице есть пример, который использует
gdb> x/4xw $sp
напечатать "четыре слова (w
) памяти над указателем стека (здесь, $sp
) в шестнадцатеричном (x
) ". Цитата слегка перефразирована.