GDB로 스택의 내용을 어떻게 볼 수 있습니까?


95

저는 GDB를 처음 사용하므로 몇 가지 질문이 있습니다.

  • 스택의 내용을 어떻게 볼 수 있습니까? 예 : 레지스터의 내용을 보려면를 입력 info registers합니다. 스택의 경우 무엇이어야합니까?

  • 의 내용을 $0x4(%esp)어떻게 볼 수 있습니까? 를 입력 print /d $0x4(%esp)하면 GDB에서 오류가 발생합니다.

플랫폼 : Linux 및 GDB


답변:


114

info frame 스택 프레임 정보 표시

주어진 주소에서 메모리를 읽으려면 x

x/x $esp부호없는 등의 부호에 대한 16 진수의 x/d $esp경우 x/u $espx는 형식 구문을 사용하므로 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스택 포인터 위에있는 메모리의 네 단어 ( )를 $sp16 진수 ( x)로 인쇄합니다. 인용문은 약간 의역 적입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.