Как можно увидеть содержимое стека с помощью 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) ". Цитата слегка перефразирована.

Другие вопросы по тегам