ฉันมีแอปพลิเคชันบรรทัดคำสั่งที่เมื่อรันไม่ได้ทำในสิ่งที่ควรทำและ ณ จุดหนึ่งออกจากข้อความ:
Segmentation fault
สิ่งนี้หมายความว่า? ฉันควรทำอย่างไร?
ฉันมีแอปพลิเคชันบรรทัดคำสั่งที่เมื่อรันไม่ได้ทำในสิ่งที่ควรทำและ ณ จุดหนึ่งออกจากข้อความ:
Segmentation fault
สิ่งนี้หมายความว่า? ฉันควรทำอย่างไร?
คำตอบ:
ผิดส่วนเป็นผลมาจากการละเมิดการเข้าถึงหน่วยความจำ โปรแกรมได้อ้างถึงที่อยู่หน่วยความจำนอกเหนือจากที่จัดสรรไว้และเคอร์เนลระบบปฏิบัติการตอบสนองโดยการฆ่าโปรแกรมด้วย SIGSEGV
นี่เป็นข้อผิดพลาดเนื่องจากไม่มีจุดในการพยายามเข้าถึงหน่วยความจำที่เข้าถึงไม่ได้ (ไม่สามารถทำได้) ข้อผิดพลาดของการจัดเรียงนี้ทำได้ง่ายอย่างไรก็ตามโดยเฉพาะอย่างยิ่งในภาษาเช่น C และ C ++ (ซึ่งบัญชีสำหรับแอปพลิเคชันทั่วไปจำนวนมาก) มันบ่งชี้ข้อผิดพลาดทั้งในโปรแกรมเองหรือห้องสมุดมันเชื่อมโยงไป หากคุณต้องการรายงานข้อผิดพลาด (ทำ - สิ่งนี้จะช่วยให้) เป็นความคิดที่ดีที่จะรวมbacktraceของเหตุการณ์ที่นำไปสู่ข้อบกพร่อง seg
ในการทำเช่นนี้คุณสามารถเรียกใช้โปรแกรมภายในgdb
(ตัวดีบัก GNU) ซึ่งควรจะใช้ได้จากลินุกซ์ distro ใด ๆ หากยังไม่ได้ติดตั้ง (แพคเกจจะถูกเรียกว่า "gdb") หากแอปพลิเคชันที่ชำรุดเรียกว่า "แอปที่เสียหาย":
gdb brokenapp
ย่อหน้าเกี่ยวกับลิขสิทธิ์และการให้สิทธิ์ใช้งานจะปรากฏขึ้นและในตอนท้ายพร้อมท์ด้วยเคอร์เซอร์:
(gdb) _
พิมพ์run
และกด Enter หากคุณต้องการระบุอาร์กิวเมนต์ (เช่น-x --foo=bar whatever
) ต่อท้าย ( run -x --foo=bar whatever
) โปรแกรมจะทำสิ่งที่มันทำคุณจะเห็นผลลัพธ์และถ้าคุณต้องการโต้ตอบคุณสามารถ (หมายเหตุคุณสามารถเรียกใช้โปรแกรมประเภทใดก็ได้รวมถึง GUI หนึ่งใน gdb) เมื่อถึงจุดที่มักจะมีเซกค่าเริ่มต้นคุณจะเห็น:
Program received signal SIGSEGV, Segmentation fault.
0x00000000006031c9 in ?? ()
(gdb) _
บรรทัดที่สองของเอาต์พุตที่นี่เป็นเพียงตัวอย่าง ตอนนี้พิมพ์bt
(สำหรับ "backtrace") และกด Enter คุณจะเห็นบางสิ่งเช่นนี้แม้ว่าอาจจะนานกว่านั้น:
(gdb) bt
#0 0x00000000006031c9 in ?? ()
#1 0x000000000040157f in mishap::what() const ()
#2 0x0000000000401377 in main ()
หากยาวกว่านี้คุณจะได้รับหน้าจอในแต่ละครั้งและจะมี--More--
ข้อความ กดปุ่ม Enter จนกว่าจะเสร็จ ตอนนี้คุณสามารถquit
ออกผลลัพธ์จะยังคงอยู่ในสถานีของคุณ คัดลอกทุกอย่างจากProgram received signal SIGSEGV
เป็นต้นไปลงในไฟล์ข้อความและยื่นรายงานข้อบกพร่องด้วยตัวติดตามบั๊กของแอปพลิเคชัน คุณสามารถค้นหาออนไลน์เหล่านี้ได้โดยค้นหาเช่น "รายงานข้อผิดพลาดที่เสียหาย" - คุณอาจต้องลงทะเบียนเพื่อให้สามารถส่งคำตอบถึงคุณทางอีเมลได้ รวมคำอธิบายปัญหาข้อโต้แย้งใด ๆ ที่คุณให้ไว้run
และอื่น ๆ และสำเนาของ backtrace (หากยาวมากอาจมีวิธีแนบไฟล์ข้อความในอินเตอร์เฟสตัวติดตามบั๊ก) รวมถึงรุ่นหากคุณรู้ว่ามันคืออะไร ( brokenapp --version
อาจทำงานหรือหน้าคนอาจระบุวิธีการได้รับ)
หวังว่าจะมีคนกลับมาหาคุณในไม่ช้า การยื่นข้อบกพร่องมักเป็นที่นิยม
gdb
ทำสิ่งต่างๆมากมาย คุณต้องการคลิกผ่านไปยังส่วน 5.1
ซึ่งหมายความว่าแอปพลิเคชันนั้นมีข้อบกพร่อง
หากคุณเป็นผู้ใช้ปลายทางคุณควรติดต่อผู้ขายแอปพลิเคชัน
หากเป็นแอปพลิเคชันของคุณเองคุณสามารถ:
$ ulimit -c unlimited
$ ./yourapp
$ gdb ./yourapp core
ไฟล์แกนจะเป็นประโยชน์อย่างมากสำหรับนักพัฒนาอื่น ๆ นอกเหนือจากตัวคุณเอง - พวกเขามีสถานะเต็มของโปรแกรมในขณะที่เกิดความผิดพลาด; หากคุณกำลังจะไปรายงานข้อผิดพลาดแนบพวกเขาและในบางกรณีไบนารีแอปของคุณ โปรดทราบว่ามีโอกาสเล็กน้อยที่ข้อมูลส่วนบุคคลของคุณเช่นหมายเลขบัญชีรหัสผ่านและสิ่งที่คล้ายกันอาจยังคงอยู่ในหน่วยความจำของโปรแกรมในขณะที่เกิดความผิดพลาด ในหลายกรณีการรายงาน backtrace ของเธรดที่ล้มเหลวเป็นตัวช่วยที่สำคัญสำหรับนักพัฒนาในการค้นหาปัญหา ในการรับ backtrace คุณสามารถโหลดไฟล์ core ด้วย debugger (เช่นgdb executable corefile
)