Как можно увидеть содержимое стека с помощью GDB?
Я новичок в GDB, поэтому у меня есть несколько вопросов:
Как посмотреть содержимое стека?
Пример: чтобы увидеть содержимое регистра, я набираю info registers
. Для стека, что это должно быть?
Как я могу увидеть содержание $0x4(%esp)
? Когда я печатаю print /d $0x4(%esp)
, GDB выдает ошибку.
Платформа: Linux и GDB
Ответы
Ответ 1
info frame
, чтобы показать информацию о кадре стека
Чтобы прочитать память по заданным адресам, вы должны взглянуть на x
x/x $esp
для hex x/d $esp
для подписанного x/u $esp
для неподписанных и т.д. x использует синтаксис формата, вы также можете взглянуть на текущую инструкцию через x/i $eip
и т.д.
Ответ 2
Использование:
1. bt
- backtrace: показать функции стека и аргументы
2. info frame
- показать указатели запуска/конца стека /args/locals
3. x/100x $sp
- показать стек памяти
(gdb) bt
#0 zzz () at zzz.c:96
#1 0xf7d39cba in yyy ([email protected]=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 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
Ответ 3
Вам нужно использовать команды отображения памяти gdb. Основной для x
для проверки. Вот пример на связанной странице, в которой используется
gdb> x/4xw $sp
для печати "четырех слов (w
) памяти над указателем стека (здесь, $sp
) в шестнадцатеричном формате (x
)". Цитата слегка перефразирована.