เราจะดูเนื้อหาของสแต็กด้วย GDB ได้อย่างไร


102

ฉันยังใหม่กับ GDB ดังนั้นฉันจึงมีคำถาม:

  • ฉันจะดูเนื้อหาของสแต็กได้อย่างไร ตัวอย่าง: info registersดูเนื้อหาของการลงทะเบียนผมพิมพ์ สำหรับสแต็คควรเป็นอย่างไร?

  • ฉันจะดูเนื้อหาของ$0x4(%esp)? เมื่อฉันพิมพ์print /d $0x4(%esp)GDB จะแสดงข้อผิดพลาด

แพลตฟอร์ม: Linux และ GDB


คำตอบ:


121

info frame เพื่อแสดงข้อมูลสแต็กเฟรม

หากต้องการอ่านหน่วยความจำตามที่อยู่ที่ระบุคุณควรดู x

x/x $espสำหรับเลขฐานสิบหกx/d $espสำหรับการลงนามx/u $espสำหรับไม่ได้ลงนามเป็นต้น x ใช้รูปแบบไวยากรณ์คุณสามารถดูคำสั่งปัจจุบันผ่านทางx/i $eipฯลฯ


73

ใช้:

  • bt - backtrace: แสดงฟังก์ชันสแต็กและ args
  • info frame - แสดงสแต็กเริ่มต้น / สิ้นสุด / args / ตัวชี้ชาวบ้าน
  • 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

59

คุณต้องใช้คำสั่งแสดงหน่วยความจำของ gdb หนึ่งขั้นพื้นฐานสำหรับการตรวจสอบx มีตัวอย่างในหน้าที่เชื่อมโยงกับที่ใช้

gdb> x/4xw $sp

เพื่อพิมพ์ "สี่คำ ( w) ของหน่วยความจำเหนือตัวชี้สแต็ก (ที่นี่$sp) เป็นเลขฐานสิบหก ( x)" ใบเสนอราคาถอดความเล็กน้อย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.