คำสั่งที่มีประโยชน์ / มีประโยชน์มากที่สุดสำหรับ gdb ดีบักเกอร์ [ปิด]


138

คุณสามารถโพสต์คำสั่งที่มีประโยชน์และมีประโยชน์ที่สุดของคุณในขณะที่คุณเรียกใช้ดีบักเกอร์เช่น gdb หรือ dbx


ฉันพบเอกสารนี้เป็นสิ่งที่ดี scc.ustc.edu.cn/zlsc/sugon/intel/debugger/cl/…
Rick

คำตอบ:


134
  1. backtrace เต็ม : backtrace สมบูรณ์ด้วยตัวแปรโลคอล
  2. ขึ้น , ลง , เฟรม : เลื่อนไปตามเฟรม
  3. นาฬิกา : ระงับกระบวนการเมื่อตรงตามเงื่อนไขที่กำหนด
  4. set print pretty on : พิมพ์รหัสต้นฉบับที่จัดรูปแบบ C เรียบร้อยแล้ว
  5. ตั้งค่าการเข้าสู่ระบบ : บันทึกเซสชันการดีบักเพื่อแสดงให้ผู้อื่นได้รับการสนับสนุน
  6. ตั้งอาร์เรย์การพิมพ์บน : การพิมพ์อาร์เรย์สวย
  7. เสร็จสิ้น : ทำต่อไปจนจบฟังก์ชั่น
  8. เปิดใช้งานและปิดการใช้งาน : เปิด / ปิดการใช้งานเบรกพอยต์
  9. tbreak : หยุดหนึ่งครั้งแล้วเอาเบรกพอยต์ออก
  10. โดยที่ : หมายเลขบรรทัดกำลังถูกดำเนินการในขณะนี้
  11. ข้อมูลท้องถิ่น : ดูตัวแปรท้องถิ่นทั้งหมด
  12. info args : ดูอาร์กิวเมนต์ของฟังก์ชันทั้งหมด
  13. รายการ : แหล่งดู
  14. rbreak : หยุดการทำงานของการจับคู่การแสดงออกปกติ

7
info locals- ดูตัวแปรท้องถิ่นทั้งหมด รายการ - ดูแหล่งที่มา; rbreak - หยุดการทำงานของฟังก์ชั่นการจับคู่การแสดงออกปกติ
Paul Biggar

source / path / to / macro / file และมาโครที่ดีทั้งหมดของฉันอยู่ที่นั่นเพื่อช่วยฉันดีบักในไม่กี่วินาที
Sudhanshu

1
set print object onสำหรับองค์ประกอบ polymorphic และset print elements 0สองคำสั่งที่ฉันใช้บ่อยมาก มีประโยชน์มาก
คิริลคิรอฟ

1
นอกจากนี้t a a bt(ความหมายthread apply all backtrace) สามารถใช้กับคำสั่งอื่น ๆ (เกือบ) ทั้งหมดได้ bt fullที่มีประโยชน์โดยเฉพาะอย่างยิ่งกับ
คิริลคิรอฟ

101

เริ่ม gdb ด้วยส่วนติดต่อผู้ใช้แบบข้อความ

gdb -tui

21
ฉันไม่อยากจะเชื่อเลยว่าฟีเจอร์นี้จะช่วยให้ฉันรอดพ้นจากมานาน ขอบคุณขอบคุณขอบคุณ!
DevSolar

ขอบคุณคุณประหยัดเวลาของฉันได้มาก ..
สงสัยมาก

1
และอีกอย่าง: <minus> RET
SullX

1
หรือใช้cgdb
Patryk

คุณสมบัติที่ดีมาก พลาดสิ่งนี้ไปแล้ว ...
PraveenMax

45

เริ่มต้นใน gdb 7.0 มีการดีบักแบบย้อนกลับได้ดังนั้นคำสั่งโปรดใหม่ของคุณคือ:

* reverse-continue ('rc') -- Continue program being debugged but run it in reverse
* reverse-finish -- Execute backward until just before the selected stack frame is called
* reverse-next ('rn') -- Step program backward, proceeding through subroutine calls.
* reverse-nexti ('rni') -- Step backward one instruction, but proceed through called subroutines.
* reverse-step ('rs') -- Step program backward until it reaches the beginning of a previous source line
* reverse-stepi -- Step backward exactly one instruction
* set exec-direction (forward/reverse) -- Set direction of execution.

21

แทนที่จะเปิดตัว GDB ด้วยพารามิเตอร์ "-tui" คุณสามารถสลับไปยังโหมดข้อความหลังจากผ่านไประยะหนึ่งโดยใช้ "wh"


3
Ctrl-a เพื่อสลับกลับไปที่มุมมองบรรทัดคำสั่ง 'ปกติ'!
เควิน

2
"- 'สามารถใช้งานได้โดยใช้' wh 'ทำให้สั้นกว่าดีกว่า .. :)
raj_gt1

6
Ctrl-a a? มันเป็นเรื่องตลกหรือไม่? ดูเหมือนคำสั่งtmux/ screenคำสั่งเพิ่มเติม และไม่ทำงานสำหรับฉัน มันจะต้องเป็นหนึ่งในเป็นต่อเอกสาร : C-x C-a, ,C-x a C-x A
x-yuri

C-x aมันเป็นเรื่องจริง คุณยังสามารถสลับมุมมองด้วยC-x 1และC-x 2เมื่ออยู่ในโหมด tui เพื่อดูชุดประกอบได้เช่นกัน (ถ้าจำเป็น)
Sam Whitlock

16

thread apply all btหรือthread apply all print $pc: สำหรับการค้นหาอย่างรวดเร็วว่าเธรดทั้งหมดกำลังทำอะไร


นั่นคือคำสั่งที่ฉันกำลังมองหาเป็นเวลานาน! มันน่ารังเกียจจริงๆที่จะตรวจสอบทั้งหมด 30 กระทู้หนึ่งโดยหนึ่ง!
tothphu


6

ใช้-command=<file with gdb commands>ตัวเลือกขณะยิง gdb -x <command file>เช่นเดียวกับ ไฟล์คำสั่งนี้สามารถมีคำสั่ง gdb เช่นเบรกพอยต์, ตัวเลือกและอื่น ๆ มีประโยชน์ในกรณีที่จำเป็นต้องเรียกใช้งานไฟล์ใดไฟล์หนึ่งผ่านการดีบักแบบต่อเนื่องโดยใช้ gdb


คุณยังสามารถใช้-iexตัวเลือกเพื่อเพิ่มแต่ละคำสั่งในบรรทัดคำสั่ง gdb
doug65536

5

gdb การเขียนสคริปต์เป็นกลอุบายที่ดีนอกเหนือจากที่ฉันชอบการตั้งค่าการเปิด / ปิดการล็อคกำหนดการเพื่อป้องกันไม่ให้การทำงานของหัวข้ออื่น ๆ เมื่อคุณกำลังก้าวเข้ามาในหนึ่ง


1
คุณจะตั้งค่าการล็อคกำหนดการได้อย่างไร
deft_code

3
set scheduler-locking oninside gdb
Ben

คุณทำให้สิ่งนี้เป็นค่าเริ่มต้นได้อย่างไร ฉันลอง. gdbinit แต่ gdb พิมพ์ /home/omry/.gdbinit:1: ข้อผิดพลาดในไฟล์คำสั่งที่มา: เป้าหมาย 'ไม่มี' ไม่สามารถรองรับคำสั่งนี้ได้
Omry Yadan

4
  • ใช้. gdbinit (เริ่มต้นไฟล์ที่คุณสามารถเขียนมาโครและโทรจาก gdb) วาง. gdbinit ในโฮมไดเร็กตอรี่ของคุณเพื่อให้ถูกหยิบขึ้นมาทุกครั้งที่มีการโหลด gdb
  • เธรดข้อมูลเพื่อแสดงรายการเธรดที่ใช้งานอยู่ทั้งหมดและ f (#) -> # หมายเลขเธรดที่คุณต้องการเปลี่ยน

  • บางครั้งฉันใช้ gdb เพื่อแปลงจากฐานสิบหกเป็นทศนิยมหรือไบนารีมันมีประโยชน์มากแทนที่จะเปิดเครื่องคิดเลข

    • p / d 0x10 -> ให้เทียบเท่าทศนิยม 0x10
    • p / t 0x10 -> เทียบเท่าเลขฐานสองของ 0x10
    • p / x 256 -> เทียบเท่าฐานสิบหกของ 256

4

แทนที่จะเริ่ม gdb ด้วยตัวเลือก - ตุ๋ยเพื่อดูกระบวนการลูกที่มีหน้าจอที่ไฮไลต์ที่บรรทัดการประมวลผลของรหัสอยู่ในโปรแกรมของคุณกระโดดเข้าและออกจากคุณลักษณะนี้ด้วย Cx o และ Cx a สิ่งนี้มีประโยชน์หากคุณกำลังใช้คุณสมบัติและสิ่งที่ไม่ควรใช้ชั่วคราวเพื่อให้คุณสามารถใช้ลูกศรขึ้นเพื่อรับคำสั่งก่อนหน้า


2
คุณสามารถเปลี่ยนโฟกัสไปที่หน้าต่างคำสั่งโดยใช้focus cmdเพื่อให้ลูกศรขึ้น / ลงทำงาน focus srcคุณสลับกลับไปใช้
Nathan Fellman

3

สิ่งนี้มีประโยชน์ฉันแน่ใจว่ามันสามารถปรับปรุงได้ แต่โปรดช่วย:

define mallocinfo
  set $__f = fopen("/dev/tty", "w")
  call malloc_info(0, $__f)
  call fclose($__f)

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