GDB - โปรแกรมดีบัก
เริ่มต้นใช้งาน: การเริ่มต้นและการหยุด
gcc -g myprogram.c
คอมไพล์ myprogram.c ด้วยอ็อพชันการดีบัก (-g) คุณยังคงได้รับ a.out แต่มีข้อมูลการดีบักที่ช่วยให้คุณใช้ตัวแปรและชื่อฟังก์ชันภายใน GDB แทนตำแหน่งหน่วยความจำดิบ (ไม่ใช่เรื่องสนุก)
gdb a.out
เปิด GDB ด้วยไฟล์ a.out แต่ไม่ได้เรียกใช้โปรแกรม คุณจะเห็นข้อความแจ้ง (gdb) - ตัวอย่างทั้งหมดมาจากพรอมต์นี้
r
r arg1 arg2
r <file1
สามวิธีในการเรียกใช้“ a.out” ซึ่งโหลดไว้ก่อนหน้านี้ คุณสามารถเรียกใช้โดยตรง (r) ส่งผ่านอาร์กิวเมนต์ (r arg1 arg2) หรือฟีดในไฟล์ โดยปกติคุณจะกำหนดจุดพักก่อนที่จะทำงาน
help
h เบรกพอยต์
แสดงหัวข้อวิธีใช้ (ความช่วยเหลือ) หรือรับความช่วยเหลือในหัวข้อเฉพาะ (h เบรกพอยต์) GDB ได้รับการบันทึกไว้เป็นอย่างดี
q - ออกจาก GDB
ก้าวผ่านรหัส
Stepping ช่วยให้คุณสามารถติดตามเส้นทางของโปรแกรมของคุณและเป็นศูนย์ในโค้ดที่หยุดทำงานหรือส่งคืนอินพุตที่ไม่ถูกต้อง
l
ล. 50
ล
แสดงรายการซอร์สโค้ด 10 บรรทัดสำหรับบรรทัดปัจจุบัน (l) บรรทัดเฉพาะ (l 50) หรือสำหรับฟังก์ชัน (l myfunction)
ต่อไป
รันโปรแกรมจนถึงบรรทัดถัดไปจากนั้นหยุดชั่วคราว หากบรรทัดปัจจุบันเป็นฟังก์ชันฟังก์ชันนี้จะเรียกใช้ฟังก์ชันทั้งหมดจากนั้นหยุดชั่วคราวnext เหมาะสำหรับการเดินผ่านโค้ดของคุณอย่างรวดเร็ว
ขั้นตอน
รันคำสั่งถัดไปไม่ใช่บรรทัด หากคำสั่งปัจจุบันกำลังตั้งค่าตัวแปรจะเหมือนกับnext. ถ้าเป็นฟังก์ชันมันจะกระโดดเข้าสู่ฟังก์ชันเรียกใช้คำสั่งแรกจากนั้นหยุดชั่วคราวstep เหมาะสำหรับการดำน้ำลึกลงไปในรายละเอียดของรหัสของคุณ
เสร็จสิ้น
เสร็จสิ้นการเรียกใช้ฟังก์ชันปัจจุบันจากนั้นหยุดชั่วคราว (เรียกอีกอย่างว่า step out) มีประโยชน์หากคุณบังเอิญก้าวเข้าสู่ฟังก์ชัน
จุดพักหรือจุดชมวิว
เบรกพอยต์มีบทบาทสำคัญในการดีบัก พวกเขาหยุด (หยุดพัก) โปรแกรมชั่วคราวเมื่อถึงจุดหนึ่ง คุณสามารถตรวจสอบและเปลี่ยนแปลงตัวแปรและดำเนินการต่อได้ สิ่งนี้มีประโยชน์เมื่อเกิดความล้มเหลวในการป้อนข้อมูลหรือต้องทดสอบอินพุต
แตก 45
ทำลายการทำงานของฉัน
- ตั้งเบรกพอยต์ที่บรรทัด 45 หรือที่ฟังก์ชันของฉัน โปรแกรมจะหยุดชั่วคราวเมื่อถึงจุดพัก
ดู x == 3
ตั้งค่า watchpoint ซึ่งจะหยุดโปรแกรมชั่วคราวเมื่อเงื่อนไขเปลี่ยนไป (เมื่อ x == 3 เปลี่ยน) Watchpoints เหมาะสำหรับอินพุตบางอย่าง (myPtr! = NULL) โดยไม่ต้องหยุดการเรียกใช้ฟังก์ชันทุกครั้ง
ดำเนินการต่อ
ดำเนินการต่อหลังจากถูกหยุดชั่วคราวโดยเบรกพอยต์ / จุดเฝ้าระวัง โปรแกรมจะดำเนินต่อไปจนกว่าจะถึงจุดพัก / จุดเฝ้าระวังถัดไป
ลบ N
- ลบเบรกพอยต์ N (เบรกพอยต์จะมีหมายเลขเมื่อสร้าง)
การตั้งค่าตัวแปร
การดูและการเปลี่ยนแปลงตัวแปรที่รันไทม์เป็นส่วนสำคัญของการดีบัก ลองป้อนข้อมูลที่ไม่ถูกต้องให้กับฟังก์ชันหรือเรียกใช้กรณีทดสอบอื่น ๆ เพื่อค้นหาสาเหตุที่แท้จริงของปัญหา โดยปกติคุณจะดู / ตั้งค่าตัวแปรเมื่อโปรแกรมหยุดชั่วคราว
พิมพ์ x
พิมพ์ค่าปัจจุบันของตัวแปร x ความสามารถในการใช้ชื่อตัวแปรดั้งเดิมเป็นสาเหตุที่ต้องใช้แฟล็ก (-g) โปรแกรมที่คอมไพล์เป็นประจำจะลบข้อมูลนี้ออกไป
ตั้งค่า x = 3
ตั้งค่า x = y
- ตั้งค่า x เป็นค่าชุด (3) หรือตัวแปรอื่น (y)
โทร myfunction ()
เรียก myotherfunction (x)
โทร strlen (mystring)
เรียกใช้ฟังก์ชันที่ผู้ใช้กำหนดหรือระบบ สิ่งนี้มีประโยชน์อย่างยิ่ง แต่ระวังการเรียกใช้ฟังก์ชันบั๊กกี้
แสดง x
แสดงค่าของตัวแปร x อย่างต่อเนื่องซึ่งจะแสดงหลังจากทุกขั้นตอนหรือหยุดชั่วคราว มีประโยชน์หากคุณตรวจสอบค่าที่แน่นอนอยู่ตลอดเวลา
ไม่แสดง x
- ลบการแสดงค่าคงที่ของตัวแปรที่แสดงโดยคำสั่ง display
Backtrace และการเปลี่ยนเฟรม
สแต็กคือรายการของการเรียกใช้ฟังก์ชันปัจจุบันซึ่งจะแสดงตำแหน่งที่คุณอยู่ในโปรแกรม กรอบเก็บรายละเอียดของการเรียกใช้ฟังก์ชันเดียวเช่นการขัดแย้ง
bt
Backtracesหรือพิมพ์สแต็กฟังก์ชันปัจจุบันเพื่อแสดงตำแหน่งที่คุณอยู่ในโปรแกรมปัจจุบัน หากสายหลักทำงาน a () ซึ่งเรียก b () ซึ่งเรียก c () backtrace คือ
c <= current location
b
a
main
up
ลง
เลื่อนไปที่เฟรมถัดไปขึ้นหรือลงในกองฟังก์ชัน ถ้าคุณอยู่ในc, คุณสามารถย้ายไปที่ b หรือ a เพื่อตรวจสอบตัวแปรท้องถิ่น
กลับ
- ส่งกลับจากฟังก์ชันปัจจุบัน
การจัดการสัญญาณ
สัญญาณคือข้อความที่เกิดขึ้นหลังจากเหตุการณ์บางอย่างเช่นตัวจับเวลาหรือข้อผิดพลาด GDB อาจหยุดชั่วคราวเมื่อพบสัญญาณ คุณอาจต้องการเพิกเฉยแทน
จัดการ [ชื่อสัญญาณ] [การกระทำ]
ด้ามจับ SIGUSR1 nostop
จัดการกับ SIGUSR1 noprint
จัดการกับ SIGUSR1 ละเว้น
สั่งให้ GDB ละเว้นสัญญาณบางอย่าง (SIGUSR1) เมื่อเกิดขึ้น การละเว้นมีหลายระดับ