จะพิมพ์ค่าลงทะเบียนใน GDB ได้อย่างไร?


191

ฉันจะพิมพ์ค่าของ%eaxและได้%ebpอย่างไร

(gdb) p $eax
$1 = void

8
ใช้layout regเพื่อให้ gdb แสดงตารางจำนวนเต็มและค่าสถานะการลงทะเบียนโดยไฮไลต์ค่าที่เปลี่ยนแปลงโดยคำสั่งก่อนหน้า ดูstackoverflow.com/tags/x86/infoตัวอย่าง
Peter Cordes

คำตอบ:


232

info registersแสดงทะเบียนทั้งหมด; แสดงให้เห็นเพียงลงทะเบียนinfo registers eax eaxคำสั่งสามารถย่อเป็นi r


ฉันได้รับ: ลงทะเบียนไม่ถูกต้อง `% eax 'และหากฉันเพิ่งทำ" info register "eax จะไม่ปรากฏขึ้น แต่ฉันกำลังดูชุดรหัสของฉันใน IDE ที่มีการสร้างสัญญาณ EXC_BAD_ACCESS ด้วยคำสั่ง: ทดสอบ% eax,% eax นี่คือใน XCode ที่กำลังทำงาน gdb ทำไม gdb ถึงไม่รายงานการลงทะเบียน eax
NoahR

1
ปัญหาเดียวกัน:% eax อยู่ในรหัส แต่การพิมพ์ $ eax แสดงเป็นโมฆะ
Ruslan Yushchenko

5
คำตอบของ Bridgette เหมาะกับฉัน คำตอบ geekosaur เป็นส่วนใหญ่ที่ถูกต้อง แต่คุณจะต้องละเว้นสัญญาณ% info registers eaxดังนั้นคำสั่งสำหรับการลงทะเบียนที่เฉพาะเจาะจงคือ ฉันไม่แน่ใจว่าสิ่งนี้แตกต่างกันสำหรับ gdb รุ่นอื่นหรือไม่
เควิน

ฉันกำลังค้นหาสิ่งเดียวกันสำหรับ lldb ดังนั้นให้ฉันเพิ่งทราบว่า: สำหรับ lldb คำสั่งคือregister read [eax]
holgac

หากคุณต้องการแสดงค่าลงทะเบียนอย่างต่อเนื่องในขณะที่คุณดูรหัสที่คุณสามารถdisplayใช้ได้ display $eaxเพื่อยกตัวอย่างเช่น
srgsanky

50

หากคุณพยายามพิมพ์การลงทะเบียนเฉพาะใน GDB คุณต้องละเว้นเครื่องหมาย% ตัวอย่างเช่น,

info registers eip

หากปฏิบัติการของคุณคือ 64 บิตการลงทะเบียนเริ่มต้นด้วย r เริ่มต้นด้วย e ไม่ถูกต้อง

info registers rip

สิ่งเหล่านี้สามารถย่อให้:

i r rip

37

นอกจากนี้ยังมี:

info all-registers

จากนั้นคุณจะได้รับชื่อการลงทะเบียนที่คุณสนใจซึ่งมีประโยชน์มากสำหรับการค้นหาการลงทะเบียนเฉพาะแพลตฟอร์ม (เช่น NEON Q ... บน ARM)


3
นี้จะเกี่ยวกับการเรียนการสอนการลงทะเบียนผมไม่ทราบว่ามีอยู่ :-)
Ciro Santilli郝海东冠状病六四事件法轮功

1
ในเครื่องของฉันพิมพ์นี้eax, ecxและลงทะเบียนมาตรฐานอื่น ๆ info registersที่ซ่อนอยู่โดย นี่อาจเป็นคำตอบที่ยอมรับได้
EntangledLoops

15
  • หากต้องการตรวจสอบเพียงครั้งเดียวinfo registersแสดงการลงทะเบียน
  • ตัวอย่างเช่นถ้าต้องการดูหนึ่ง register เท่านั้นให้display $espแสดงการลงทะเบียน esp ในบรรทัดคำสั่ง gdb ต่อไป
  • หากต้องการดูการลงทะเบียนทั้งหมดlayout regsให้แสดงการลงทะเบียนต่อไปด้วยโหมด TUI

12

คำสั่ง Gdb :

  • i r <register_name>: พิมพ์ทะเบียนเพียงครั้งเดียวเช่นi r rax,i r eax
  • i r <register_name_1> <register_name_2> ...: พิมพ์หลายลงทะเบียนเช่นi r rdi rsi,
  • i r: พิมพ์การลงทะเบียนทั้งหมดยกเว้นทศนิยมและการลงทะเบียนเวกเตอร์ (xmm, ymm, zmm)
  • i r a: พิมพ์การลงทะเบียนทั้งหมดรวมถึงทศนิยมและการลงทะเบียนเวกเตอร์ (xmm, ymm, zmm)
  • i r f: พิมพ์การลงทะเบียนลอยตัว FPU ทั้งหมด ( st0-7และอีกสองสามรายการf*)

กลุ่มการลงทะเบียนอื่น ๆ นอกเหนือจากa( all) และf( float) สามารถพบได้กับ:

maint print reggroups

ตามที่บันทึกไว้ที่: https://sourceware.org/gdb/current/onlinedocs/gdb/Registers.html#Registers

เคล็ดลับ :

  • xmm0~ xmm15เป็น 128 บิตเกือบทุกเครื่องทันสมัยมีมันพวกเขาได้รับการปล่อยตัวในปี 1999
  • ymm0~ ymm15, เป็น 256 บิต, เครื่องใหม่มักจะมีมัน, พวกเขาจะเปิดตัวในปี 2011
  • zmm0~ zmm31เป็น 512 บิตพีซีปกติอาจไม่มี ( เหมือนปี 2559 ) พวกเขาเปิดตัวในปี 2556 และส่วนใหญ่ใช้ในเซิร์ฟเวอร์จนถึงตอนนี้
  • จะแสดงซีเรียล xmm / ymm / zmm เดียวเท่านั้นเนื่องจากจะเป็นรีจิสเตอร์เดียวกันในโหมดที่ต่างกัน บนเครื่องของฉัน ymm จะปรากฏขึ้น

6

p $eax ทำงานเหมือน GDB 7.7.1

ในฐานะของ GDB 7.7.1 คำสั่งที่คุณพยายามใช้งาน:

set $eax = 0
p $eax
# $1 = 0
set $eax = 1
p $eax
# $2 = 1

ไวยากรณ์นี้ยังสามารถใช้เพื่อเลือกระหว่างสมาชิกสหภาพที่แตกต่างกันเช่นสำหรับการลงทะเบียน ARM floating point ซึ่งสามารถเป็นทศนิยมหรือเลขจำนวนเต็ม:

p $s0.f
p $s0.u

จากเอกสาร :

ชื่อใด ๆ ที่นำหน้าด้วย '$' สามารถใช้สำหรับตัวแปรอำนวยความสะดวกเว้นแต่ว่าเป็นชื่อลงทะเบียนเฉพาะเครื่องที่กำหนดไว้ล่วงหน้า

และ :

คุณสามารถอ้างถึงเนื้อหาที่ลงทะเบียนเครื่องเป็นนิพจน์เป็นตัวแปรที่มีชื่อขึ้นต้นด้วย '$' ชื่อของการลงทะเบียนนั้นแตกต่างกันสำหรับแต่ละเครื่อง ใช้การลงทะเบียนข้อมูลเพื่อดูชื่อที่ใช้ในเครื่องของคุณ

แต่ฉันยังไม่ได้โชคดีกับการลงทะเบียนการควบคุมจนถึงตอนนี้: OSDev 2012 http://f.osdev.org/viewtopic.php?f=1&t=25968 || คำขอคุณลักษณะปี 2005 https://www.sourceware.org/ml/gdb/2005-03/msg00158.html || alt.lang.asm 2013 https://groups.google.com/forum/#!topic/alt.lang.asm/JC7YS3Wu31I

การลงทะเบียน ARM floating point

ดู: /reverseengineering/8992/floating-point-registers-on-arm/20623#20623


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