วิธีใช้โปรแกรมแก้ไขข้อบกพร่อง GNU ใน Linux

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 เราหวังว่าคุณจะพบว่าข้อมูลในหน้านี้มีประโยชน์