วิธีค้นหาสาเหตุของข้อผิดพลาดในการแบ่งส่วนใน C ++

Withi Khnha Sahetu Khxng Khx Phid Phlad Ni Kar Baeng Swn Ni C



ข้อผิดพลาดในการแบ่งส่วนหรือที่เรียกว่าข้อผิดพลาดในการแบ่งส่วนเป็นข้อผิดพลาดประเภทหนึ่งที่เกิดขึ้นเมื่อโปรแกรมพยายามเข้าถึงส่วนหน่วยความจำที่ไม่ได้รับอนุญาตให้เข้าถึง เมื่อเกิดข้อผิดพลาดในการแบ่งเซ็กเมนต์ ระบบปฏิบัติการจะหยุดโปรแกรมเพื่อป้องกันไม่ให้เกิดปัญหาเพิ่มเติม โดยทั่วไปข้อผิดพลาดนี้บ่งชี้จุดบกพร่องหรือข้อผิดพลาดในการเขียนโปรแกรมในโค้ดของโปรแกรม เช่น การเข้าถึงพอยน์เตอร์ที่ไม่ได้กำหนดค่าเริ่มต้น การยกเลิกการอ้างอิงพอยน์เตอร์ว่าง หรือเกินขอบเขตของอาร์เรย์

ข้อผิดพลาดในการแบ่งส่วนอาจเป็นเรื่องที่ท้าทายในการแก้ไข เนื่องจากมักส่งผลให้เกิดการหยุดทำงานโดยไม่ระบุข้อความแสดงข้อผิดพลาดโดยละเอียด อย่างไรก็ตาม เครื่องมืออย่าง GDB (GNU Debugger) สามารถช่วยระบุแหล่งที่มาของข้อผิดพลาดในการแบ่งส่วนได้โดยการตรวจสอบสถานะของโปรแกรมและการติดตามสแต็ก ณ เวลาที่เกิดข้อผิดพลาด

สิ่งสำคัญคือต้องทราบว่าข้อผิดพลาดในการแบ่งเซ็กเมนต์มักเกิดจากข้อผิดพลาดในการเขียนโปรแกรมและถือเป็นข้อบกพร่อง ควรแก้ไขโดยการตรวจสอบและแก้ไขโค้ดที่มีปัญหา สาเหตุทั่วไปของความผิดพลาดในการแบ่งส่วน ได้แก่:







  • การยกเลิกการอ้างอิงตัวชี้ที่เป็นโมฆะหรือไม่ได้กำหนดค่าเริ่มต้น
  • การเขียนหรือการอ่านนอกขอบเขตของอาร์เรย์
  • การใช้หน่วยความจำที่ถูกจัดสรรคืนหรือรีลีสก่อนหน้านี้
  • สแต็กโอเวอร์โฟลว์หรือความเสียหายของสแต็ก
  • การใช้ตัวแปรที่ไม่ได้กำหนดค่าเริ่มต้น

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



GDB ดีบักเกอร์

GDB (GNU Debugger) เป็นเครื่องมือแก้ไขจุดบกพร่องที่มีประสิทธิภาพ ซึ่งช่วยในการระบุและวิเคราะห์ปัญหาในโปรแกรมที่คอมไพล์ รวมถึงข้อผิดพลาดในการแบ่งส่วน ช่วยให้ตรวจสอบสถานะของโปรแกรม ทริกเกอร์เบรกพอยท์ และสังเกตขั้นตอนการดำเนินการได้



หากต้องการใช้ GDB อย่างมีประสิทธิภาพเพื่อแก้ไขข้อผิดพลาดในการแบ่งเซ็กเมนต์ คุณต้องคอมไพล์โปรแกรม C++ ของคุณด้วยสัญลักษณ์การดีบักที่เปิดใช้งาน สัญลักษณ์เหล่านี้ประกอบด้วยข้อมูลเพิ่มเติมเกี่ยวกับโครงสร้างของโปรแกรม ตัวแปร และฟังก์ชันที่ช่วยในกระบวนการดีบัก





ค้นหาข้อผิดพลาดการแบ่งส่วนใน C ++ ด้วย GDB

นี่คือตัวอย่างโค้ดที่ทำให้เกิดข้อผิดพลาดในการแบ่งส่วน:

#รวม

ภายใน หลัก ( ) {

ภายใน * ปตท = nullptr ;

* ปตท = 5 ;

กลับ 0 ;

}

ก่อนอื่นเรามาอธิบายโค้ดกันก่อน จากนั้น เราจะหารือในขั้นตอนเกี่ยวกับการค้นหาข้อผิดพลาดในการแบ่งส่วนในโค้ดก่อนหน้า



คำสั่งตัวประมวลผลล่วงหน้า “#include ” จะเพิ่มไฟล์ส่วนหัว ที่จำเป็นซึ่งมีอินพุตและคุณลักษณะสตรีมเอาต์พุตใน C ++

ภายในฟังก์ชัน 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++ ของคุณได้อย่างมีประสิทธิภาพ