แสดงคำสั่งการประกอบปัจจุบันใน GDB


179

ฉันกำลังทำการดีบักระดับชุดประกอบใน GDB มีวิธีที่จะทำให้ GDB แสดงคำสั่งชุดประกอบปัจจุบันในลักษณะเดียวกับที่แสดงบรรทัดซอร์สปัจจุบันหรือไม่ เอาต์พุตเริ่มต้นหลังจากทุกคำสั่งมีลักษณะดังนี้:

0x0001433f      990         Foo::bar(p);

สิ่งนี้ให้ที่อยู่ของคำแนะนำปัจจุบัน แต่ฉันต้องอ้างอิงกลับไปที่ผลลัพธ์ของdisassembleคำสั่งเพื่อดูว่าคำสั่งใดที่ฉันกำลังเรียกใช้อยู่


คำตอบ:


315

คุณสามารถเปลี่ยนเป็นเค้าโครงการชุมนุมใน GDB:

(gdb) layout asm

ดูที่นี่สำหรับข้อมูลเพิ่มเติม คำแนะนำการประกอบปัจจุบันจะแสดงในหน้าต่างแอสเซมเบลอร์

   ┌───────────────────────────────────────────────────────────────────────────┐
   │0x7ffff740d756 <__libc_start_main+214>  mov    0x39670b(%rip),%rax        #│
   │0x7ffff740d75d <__libc_start_main+221>  mov    0x8(%rsp),%rsi              │
   │0x7ffff740d762 <__libc_start_main+226>  mov    0x14(%rsp),%edi             │
   │0x7ffff740d766 <__libc_start_main+230>  mov    (%rax),%rdx                 │
   │0x7ffff740d769 <__libc_start_main+233>  callq  *0x18(%rsp)                 │
  >│0x7ffff740d76d <__libc_start_main+237>  mov    %eax,%edi                   │
   │0x7ffff740d76f <__libc_start_main+239>  callq  0x7ffff7427970 <exit>       │
   │0x7ffff740d774 <__libc_start_main+244>  xor    %edx,%edx                   │
   │0x7ffff740d776 <__libc_start_main+246>  jmpq   0x7ffff740d6b9 <__libc_start│
   │0x7ffff740d77b <__libc_start_main+251>  mov    0x39ca2e(%rip),%rax        #│
   │0x7ffff740d782 <__libc_start_main+258>  ror    $0x11,%rax                  │
   │0x7ffff740d786 <__libc_start_main+262>  xor    %fs:0x30,%rax               │
   │0x7ffff740d78f <__libc_start_main+271>  callq  *%rax                       │
   └───────────────────────────────────────────────────────────────────────────┘
multi-thre process 3718 In: __libc_start_main     Line: ??   PC: 0x7ffff740d76d
#3  0x00007ffff7466eb5 in _IO_do_write () from /lib/x86_64-linux-gnu/libc.so.6
#4  0x00007ffff74671ff in _IO_file_overflow ()
   from /lib/x86_64-linux-gnu/libc.so.6
#5  0x0000000000408756 in ?? ()
#6  0x0000000000403980 in ?? ()
#7  0x00007ffff740d76d in __libc_start_main ()
   from /lib/x86_64-linux-gnu/libc.so.6
(gdb)

1
@greatwolf ดูเหมือนว่าคุณไม่มีการสนับสนุนตุ้ยใน gdb ของคุณ ดูคำถามนี้สำหรับข้อมูลเพิ่มเติม: stackoverflow.com/q/6706838/72178
ks1322

9
เรียบร้อย! ตอนนี้ฉันสามารถมีหน้าต่างที่คล้ายกันสำหรับการลงทะเบียนได้หรือไม่ แน่นอนฉันสามารถ:layout regs
Jens

ดูที่gdb docs สำหรับคำสั่ง TUI อื่น ๆเช่นต้องการtui reg vectorแสดงเวกเตอร์ regs แทนที่จะเป็นจำนวนเต็ม regs (ไม่สามารถใช้งานได้เสมอเพราะมันไม่อนุญาตให้คุณเลือกเพียง.v8_int16บางสิ่งดังนั้นหน้าจอจึงยุ่งเหยิงอย่างมาก) ดูแท็ก x86สำหรับการสอนด่วนเพื่อดีบัก asm
Peter Cordes

นั่นเป็นเรื่องเกี่ยวกับคุณสมบัติและเอาท์พุทที่ไร้ประโยชน์ ชื่อ mangled ของ C ++ นั้นยาวเกินไปและทุกอย่างที่ฉันพยายามจะดูอยู่นอกจอทางด้านขวา การตัดสินใจโง่ ๆ แบบใด (ไม่แสดง ASM ตามค่าเริ่มต้นเมื่อsi) และคุณลักษณะที่ไร้ประโยชน์ (วิวพอร์ตที่ไม่แสดงข้อมูลที่จำเป็น) ออกเสียงลงคะแนนคำตอบนี้ไม่มีเหตุผลเพราะคุณเป็นแค่ผู้ส่งสาร ...
jww

1
ในทำนองเดียวกันเมื่อ·layout srcต้องการดูรหัสที่มาเมื่อการแก้จุดบกพร่องและยังคุ้มค่าการจำออกจากโหมดนี้โดยCTRL+x+a
Baiyan Huang
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.