ข้อผิดพลาดในการแบ่งส่วนอาจเป็นเรื่องที่ท้าทายในการแก้ไข เนื่องจากมักส่งผลให้เกิดการหยุดทำงานโดยไม่ระบุข้อความแสดงข้อผิดพลาดโดยละเอียด อย่างไรก็ตาม เครื่องมืออย่าง GDB (GNU Debugger) สามารถช่วยระบุแหล่งที่มาของข้อผิดพลาดในการแบ่งส่วนได้โดยการตรวจสอบสถานะของโปรแกรมและการติดตามสแต็ก ณ เวลาที่เกิดข้อผิดพลาด
สิ่งสำคัญคือต้องทราบว่าข้อผิดพลาดในการแบ่งเซ็กเมนต์มักเกิดจากข้อผิดพลาดในการเขียนโปรแกรมและถือเป็นข้อบกพร่อง ควรแก้ไขโดยการตรวจสอบและแก้ไขโค้ดที่มีปัญหา สาเหตุทั่วไปของความผิดพลาดในการแบ่งส่วน ได้แก่:
- การยกเลิกการอ้างอิงตัวชี้ที่เป็นโมฆะหรือไม่ได้กำหนดค่าเริ่มต้น
- การเขียนหรือการอ่านนอกขอบเขตของอาร์เรย์
- การใช้หน่วยความจำที่ถูกจัดสรรคืนหรือรีลีสก่อนหน้านี้
- สแต็กโอเวอร์โฟลว์หรือความเสียหายของสแต็ก
- การใช้ตัวแปรที่ไม่ได้กำหนดค่าเริ่มต้น
ด้วยการตรวจสอบโค้ดของคุณอย่างรอบคอบและการใช้เครื่องมือแก้ไขจุดบกพร่อง เช่น GDB คุณสามารถระบุและแก้ไขข้อผิดพลาดในการแบ่งส่วนได้ ทำให้มั่นใจได้ว่าโปรแกรมของคุณทำงานได้อย่างถูกต้องและไม่พบข้อผิดพลาดเหล่านี้
GDB ดีบักเกอร์
GDB (GNU Debugger) เป็นเครื่องมือแก้ไขจุดบกพร่องที่มีประสิทธิภาพ ซึ่งช่วยในการระบุและวิเคราะห์ปัญหาในโปรแกรมที่คอมไพล์ รวมถึงข้อผิดพลาดในการแบ่งส่วน ช่วยให้ตรวจสอบสถานะของโปรแกรม ทริกเกอร์เบรกพอยท์ และสังเกตขั้นตอนการดำเนินการได้
หากต้องการใช้ GDB อย่างมีประสิทธิภาพเพื่อแก้ไขข้อผิดพลาดในการแบ่งเซ็กเมนต์ คุณต้องคอมไพล์โปรแกรม C++ ของคุณด้วยสัญลักษณ์การดีบักที่เปิดใช้งาน สัญลักษณ์เหล่านี้ประกอบด้วยข้อมูลเพิ่มเติมเกี่ยวกับโครงสร้างของโปรแกรม ตัวแปร และฟังก์ชันที่ช่วยในกระบวนการดีบัก
ค้นหาข้อผิดพลาดการแบ่งส่วนใน C ++ ด้วย GDB
นี่คือตัวอย่างโค้ดที่ทำให้เกิดข้อผิดพลาดในการแบ่งส่วน:
#รวมภายใน หลัก ( ) {
ภายใน * ปตท = nullptr ;
* ปตท = 5 ;
กลับ 0 ;
}
ก่อนอื่นเรามาอธิบายโค้ดกันก่อน จากนั้น เราจะหารือในขั้นตอนเกี่ยวกับการค้นหาข้อผิดพลาดในการแบ่งส่วนในโค้ดก่อนหน้า
คำสั่งตัวประมวลผลล่วงหน้า “#include
ภายในฟังก์ชัน main() มีการประกาศตัวแปรตัวชี้ “ptr” ประเภท int* ค่า “nullptr” ถูกใช้เป็นการเริ่มต้นของตัวชี้ ซึ่งเป็นค่าตัวชี้ null พิเศษที่ระบุว่าไม่ได้ชี้ไปที่ใดๆ ตำแหน่งหน่วยความจำที่ถูกต้อง
ความพยายามในการอ้างอิงจะทำโดยใช้ตัวชี้ว่าง “ptr” ในบรรทัดต่อไปนี้ซึ่งก็คือ “*ptr = 5;” ในกรณีนี้ เนื่องจาก 'ptr' ถูกตั้งค่าเป็น 'nullptr' จึงไม่มีตำแหน่งหน่วยความจำที่ถูกต้องในการเข้าถึง
ตอนนี้ เราจะพูดถึงขั้นตอนบางอย่างที่ต้องนำมาใช้ในการรวบรวมโปรแกรมเพื่อค้นหาข้อผิดพลาดในการแบ่งส่วน
ขั้นตอนที่ 1: เปิดใช้งานสัญลักษณ์การดีบัก
ในการเริ่มต้น ตรวจสอบให้แน่ใจว่าได้คอมไพล์โปรแกรม C++ ของคุณด้วยสัญลักษณ์การดีบักที่เปิดใช้งาน หากต้องการให้ข้อมูลการดีบักแก่ไฟล์ปฏิบัติการระหว่างการคอมไพล์ ให้ใช้แฟล็ก '-g' พิจารณากรณีที่เรามีไฟล์ C++ ชื่อ “main.cpp”
$ ก++ -ก main.cpp -โอ หลักขั้นตอนที่ 2: เรียกใช้ GDB
เมื่อโปรแกรมถูกคอมไพล์ด้วยสัญลักษณ์การดีบักแล้ว ให้รัน GDB โดยส่งไฟล์ปฏิบัติการเป็นอาร์กิวเมนต์
$ จีดีบี หลักขั้นตอนที่ 3: เริ่มโปรแกรม
เริ่มโปรแกรมโดยพิมพ์ 'run' หรือ 'r' ที่พรอมต์ GDB:
$ ( จีดีบี ) วิ่งโปรแกรมของคุณจะเริ่มดำเนินการ
ขั้นตอนที่ 4: ระบุข้อผิดพลาดในการแบ่งส่วน
โปรแกรมยังคงทำงานต่อไปจนกว่าจะพบข้อผิดพลาดในการแบ่งส่วน โปรแกรมหยุดทำงานแล้ว และ GDB จะสร้างข้อความแสดงข้อผิดพลาด
ตัวอย่างเช่น ลองพิจารณาโค้ดที่อธิบายไว้ก่อนหน้านี้ ซึ่งเมื่อเราพยายามกำหนดค่า 5 ให้กับตำแหน่งหน่วยความจำที่ชี้ไปโดยตัวชี้ค่าว่าง จะส่งผลให้เกิดข้อผิดพลาดในการแบ่งส่วน โปรแกรมสิ้นสุดทันทีที่บรรทัดที่เกิดข้อผิดพลาดในการแบ่งส่วน
เมื่อรันโปรแกรมนี้ด้วย GDB คุณจะเห็นผลลัพธ์ที่คล้ายกันดังต่อไปนี้:
ผลลัพธ์นี้บ่งชี้ว่ามีข้อผิดพลาดในการแบ่งส่วนเกิดขึ้นในฟังก์ชันหลักที่บรรทัดที่ 5 ของไฟล์ 'main.cpp'
ขั้นตอนที่ 5: ตรวจสอบ Stack Trace
หากต้องการทราบข้อมูลเชิงลึกเพิ่มเติมเกี่ยวกับข้อผิดพลาดในการแบ่งเซ็กเมนต์ คุณสามารถตรวจสอบการติดตามสแต็กได้โดยใช้คำสั่ง 'backtrace' หรือเพียงแค่ 'bt' คำสั่งนี้แสดงลำดับการเรียกใช้ฟังก์ชันที่นำไปสู่การขัดข้อง
$ ( จีดีบี ) บาทการติดตามสแต็กจะปรากฏขึ้นซึ่งระบุฟังก์ชันที่ถูกเรียกก่อนข้อผิดพลาดในการแบ่งส่วน:
ผลลัพธ์นี้บอกเราว่าข้อผิดพลาดในการแบ่งส่วนเกิดขึ้นในฟังก์ชันหลักที่บรรทัดที่ 5 ของไฟล์ 'main.cpp'
ขั้นตอนที่ 6: ตั้งค่าเบรกพอยต์
หากต้องการตรวจสอบเพิ่มเติม คุณสามารถตั้งค่าเบรกพอยต์ในบรรทัดโค้ดเฉพาะเพื่อหยุดการทำงานของโปรแกรมที่จุดเหล่านั้นได้ ซึ่งจะทำให้คุณสามารถตรวจสอบสถานะและตัวแปรของโปรแกรมได้ ตัวอย่างเช่น หากต้องการตั้งค่าเบรกพอยต์ที่บรรทัดที่ 5 ของ 'main.cpp' ให้ใช้คำสั่ง 'break' ดังนี้:
$ ( จีดีบี ) หยุดพัก main.cpp: 5ซึ่งจะตั้งค่าเบรกพอยต์ที่บรรทัดที่ 5 ของไฟล์ “main.cpp”:
ขั้นตอนที่ 7: ดำเนินการดำเนินการต่อ
หลังจากตั้งค่าเบรกพอยต์แล้ว ให้ดำเนินการโปรแกรมต่อโดยใช้คำสั่ง 'ดำเนินการต่อ' หรือเพียงแค่ 'c':
$ ( จีดีบี ) ดำเนินการต่อโปรแกรมทำงานต่อไปจนกว่าจะถึงจุดพัก
ขั้นตอนที่ 8: ตรวจสอบตัวแปรและโค้ด
เมื่อโปรแกรมหยุดที่จุดพัก คุณสามารถใช้คำสั่ง GDB ต่างๆ เพื่อตรวจสอบตัวแปร ก้าวผ่านโค้ด และตรวจสอบสาเหตุของข้อผิดพลาดในการแบ่งส่วน
ขั้นตอนที่ 9: ออกจาก GDB
เมื่อคุณแก้ไขข้อบกพร่องเสร็จแล้ว คุณสามารถออกจาก GDB ได้โดยใช้คำสั่ง 'quit':
$ ( จีดีบี ) ล้มเลิกข้อมูลนี้แสดงภาพรวมพื้นฐานของการใช้ GDB เพื่อค้นหาข้อผิดพลาดในการแบ่งเซ็กเมนต์ในโปรแกรม C++ GDB มีคุณสมบัติและคำสั่งเพิ่มเติมมากมายที่สามารถช่วยในการดีบัก และคุณสามารถดูเอกสาร GDB เพื่อดูข้อมูลเชิงลึกเพิ่มเติม
บทสรุป
บทความนี้สาธิตการใช้ GDB เพื่อค้นหาข้อผิดพลาดในการแบ่งส่วนใน C ++ เราอธิบายให้คุณทราบถึงขั้นตอนที่ต้องปฏิบัติตาม ขั้นตอนเหล่านี้มีคำอธิบายที่ครอบคลุมเกี่ยวกับวิธีการค้นหาข้อผิดพลาดในการแบ่งส่วนใน C++ โดยใช้ GDB ด้วยการทำตามขั้นตอนเหล่านี้และใช้คุณลักษณะของ GDB คุณสามารถค้นหาและแก้ไขข้อบกพร่องแหล่งที่มาของข้อผิดพลาดในการแบ่งส่วนในโปรแกรม C++ ของคุณได้อย่างมีประสิทธิภาพ