GNU Debugger ใช้เพื่อดีบักโปรแกรม เพื่อวิเคราะห์ข้อขัดข้อง หรือเพื่อดูว่าโปรแกรมทำอะไร ณ จุดใดจุดหนึ่ง ได้รับการพัฒนาโดยโครงการ GNU ในปี 1980 และเป็นหนึ่งในโปรแกรมแก้ไขจุดบกพร่องบรรทัดคำสั่งที่ใช้กันอย่างแพร่หลายมากที่สุดและเป็นหนึ่งในซอฟต์แวร์ GNU ที่ได้รับความนิยมมากที่สุด
ให้เราเขียนโปรแกรม C เล็กๆ ก่อน แล้วเราจะทำการดีบั๊ก ในการเริ่มต้นสร้างใหม่ .ค
ไฟล์โดยใช้ เป็นกลุ่ม
หรือบรรณาธิการที่คุณเลือก:
เป็นกลุ่ม test.c
สร้างโปรแกรม C ต่อไปนี้:
#include int main() { int i = 5; ลอย f = 5.5 i = i + 3; f = f + 2.2; printf("ค่าของ i และ f คือ: %d และ %f\n", i, f); กลับ 0; }
กด หนี
เพื่อไปที่โหมดคำสั่ง vim แล้วพิมพ์ :wq
เพื่อบันทึกโปรแกรมและออก
รวบรวมและดูว่าโปรแกรมทำงานหรือไม่:
gcc test.c -o test ./test ค่าของ i และ f คือ 8 และ 7.700000
เพื่อเปิดใช้งานการสนับสนุนการดีบักในโปรแกรม เรารวบรวมมันด้วย -g
ธง. หากไม่ได้ใช้แฟล็ก ผู้ใช้ยังสามารถดีบักโปรแกรมได้ แม้ว่าจะมีตัวเลือกที่จำกัด
gcc test.c -g -o test
เพื่อเริ่มการดีบัก ไฟล์ปฏิบัติการของเรา ทดสอบ
ใน gdb
, พวกเราวิ่ง:
gdb ทดสอบ
มันจะเปิด gdb
คอนโซล ซึ่งคุณสามารถพิมพ์ gdb
คำสั่ง หากต้องการดูรายการคำสั่งให้ใช้คำสั่ง ช่วย
สั่งการ.
$(gdb) help รายการของคลาสของคำสั่ง: นามแฝง - นามแฝงของคำสั่งเบรกพอยต์ - การทำให้โปรแกรมหยุดที่ข้อมูลบางจุด - การตรวจสอบไฟล์ข้อมูล - การระบุและตรวจสอบไฟล์ภายใน - คำสั่งการบำรุงรักษาที่ไม่ชัดเจน - คุณสมบัติการทำงานที่ไม่ชัดเจน -- การรันโปรแกรมสแตก -- การตรวจสอบสถานะของสแตก -- การสนับสนุนการสอบถามสถานะ -- การติดตามสิ่งอำนวยความสะดวก -- การติดตามการทำงานของโปรแกรมโดยไม่หยุดโปรแกรมที่ผู้ใช้กำหนด -- คำสั่งที่ผู้ใช้กำหนด พิมพ์ "ความช่วยเหลือ" ตามด้วยชื่อคลาส สำหรับรายการคำสั่งในคลาสนั้น พิมพ์ "help all" สำหรับรายการคำสั่งทั้งหมด พิมพ์ "help" ตามด้วยชื่อคำสั่งเพื่อดูเอกสารฉบับเต็ม พิมพ์ "apropos word" เพื่อค้นหาคำสั่งที่เกี่ยวข้องกับ "word" อนุญาตให้ใช้ตัวย่อของชื่อคำสั่งได้หากไม่มีความกำกวม
จากนั้นคุณสามารถพิมพ์ ช่วย class_name
เพื่อดูคำสั่งของคลาสนั้น หากต้องการค้นหาคำสั่งโดยใช้สตริงย่อย ให้ใช้ apropos สตริงย่อย
.
การตั้งค่าเบรกพอยต์เมื่อโปรแกรมเข้าสู่ฟังก์ชั่น วิ่ง:
$(gdb) ตัวแบ่งหลัก
ที่นี่เราตั้งค่าเบรกพอยต์ที่ฟังก์ชันเดียวในโค้ดของเรา นั่นคือ หลัก
. ใช้คำสั่ง วิ่ง
เพื่อรันโปรแกรมจนถึงเบรกพอยต์ถัดไป หรือจนกว่าจะออก
$(gdb) วิ่ง
ในการตั้งค่าเบรกพอยต์ที่ตำแหน่งเฉพาะในฟังก์ชัน ใช้:
ตัวแบ่ง *หลัก + 4
สิ่งนี้จะตั้งค่าเบรกพอยต์ที่บรรทัดที่ 4 ของฟังก์ชันหลัก
ตอนนี้, เพื่อก้าวข้ามกระแสของโปรแกรมไปยังบรรทัดโค้ดถัดไป เพียงแค่เรียกใช้ ขั้นตอน
สั่งการ.
$(gdb) ขั้นตอนที่ 5: ลอย f = 5.5;
เพื่อแสดงเนื้อหาของตัวแปร วิ่ง แสดง
.
$(gdb) แสดง i 6: i = 5
ในการแก้ไขเนื้อหาของตัวแปร ซึ่งอาจจำเป็นต้องวิเคราะห์การรันโปรแกรมภายใต้ค่าเฉพาะของตัวแปร run ตั้งค่าตัวแปร = นิพจน์
.
$(gdb) ตั้งค่าตัวแปร i=10 $(gdb) แสดง i 7: i = 10
ที่นี่ 'นิพจน์' สามารถเป็นนิพจน์ (เลขคณิต / ตรรกะ) ที่ถูกต้องได้ เพื่อความเรียบง่ายเราเพียงแค่กำหนดค่าอื่น (10) ให้กับตัวแปร ผม
.
ในการพิมพ์รหัสแอสเซมบลีของโปรแกรม ใช้คำสั่ง ถอดชื่อฟังก์ชัน
:
ใช้เพียง ถอดประกอบ
เพื่อพิมพ์รหัสแอสเซมบลีสำหรับทั้งโปรแกรม สังเกตลูกศรที่บรรทัดใดบรรทัดหนึ่งในรหัสแอสเซมบลี แสดงว่าเซสชันการดีบักถูกหยุดชั่วคราว ณ ตำแหน่งหน่วยความจำนั้น (เช่น บรรทัดของโค้ดนั้น)
ในการข้ามโปรแกรมดีบั๊กที่บรรทัดหนึ่งของรหัส วิ่ง:
$(gdb) กระโดด *main + 2 ต่อเนื่องที่ 0x400528 เบรกพอยต์ 2, 0x00000000000040052a ใน main () ที่ test.c:3 3 int main () { 1: i = 2: f = 3: h = (เป็นโมฆะ *) 0x0 4: main = {int ()} 0x400526 5: i =
สิ่งนี้จะทำให้ดีบักเกอร์ข้ามไปที่ตำแหน่งหน่วยความจำของโค้ดบรรทัดที่ 2 ในฟังก์ชัน หลัก
. โปรดทราบว่าที่นี่ฉันกระโดดจากจุดเริ่มต้นของตำแหน่งหลักไปยังตำแหน่งที่สองโดยตรง ดังนั้น ตัวแปร ผม
ไม่เคยตั้งค่าซึ่งส่งผลให้ดีบักเกอร์โยนข้อผิดพลาดที่ไม่สามารถเข้าถึงเนื้อหาหน่วยความจำตามที่อยู่ของตัวแปร ผม
.
นี่คือคำสั่งพื้นฐานบางส่วนที่สามารถช่วยคุณในการเริ่มต้นการดีบักไฟล์ปฏิบัติการใน Linux เราหวังว่าคุณจะพบว่าข้อมูลในหน้านี้มีประโยชน์