Як можна побачити вміст стека за допомогою GDB?


95

Я новачок у GDB, тому маю кілька запитань:

  • Як я можу подивитися на вміст стека? Приклад: щоб переглянути вміст реєстру, я вводжу info registers. Для стека, яким він повинен бути?

  • Як я можу побачити вміст $0x4(%esp)? Коли я print /d $0x4(%esp)вводжу, GDB видає помилку.

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


Відповіді:


114

info frame щоб показати інформацію про кадр стека

Щоб прочитати пам'ять за вказаними адресами, слід поглянути x

x/x $espдля hex x/d $espдля підписаних x/u $espдля непідписаних тощо. x використовує синтаксис формату, ви також можете поглянути на поточну інструкцію через x/i $eipтощо.


69

Використання:

  • bt - зворотний трас: показати функції стека та аргументи
  • 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

56

Вам потрібно використовувати команди відображення пам’яті gdb. Основний - xдля обстеження . Є приклад на використаній сторінці з посиланням

gdb> x/4xw $sp

вивести "чотири слова ( w) пам'яті над вказівником стека (тут, $sp) у шістнадцятковій ( x)". Цитата трохи перефразувана.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.