Подтвердить что ты не робот

Как можно увидеть содержимое стека с помощью GDB?

Я новичок в GDB, поэтому у меня есть несколько вопросов:

  • Как посмотреть содержимое стека? Пример: чтобы увидеть содержимое регистра, я набираю info registers. Для стека, что это должно быть?

  • Как я могу увидеть содержание $0x4(%esp)? Когда я печатаю print /d $0x4(%esp), GDB выдает ошибку.

Платформа: Linux и GDB

4b9b3361

Ответ 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)". Цитата слегка перефразирована.