การเรียกใช้แอปพลิเคชันลงท้ายด้วย“ Segmentation Fault”


39

ฉันมีแอปพลิเคชันบรรทัดคำสั่งที่เมื่อรันไม่ได้ทำในสิ่งที่ควรทำและ ณ จุดหนึ่งออกจากข้อความ:

Segmentation fault

สิ่งนี้หมายความว่า? ฉันควรทำอย่างไร?


คำตอบ:


62

ผิดส่วนเป็นผลมาจากการละเมิดการเข้าถึงหน่วยความจำ โปรแกรมได้อ้างถึงที่อยู่หน่วยความจำนอกเหนือจากที่จัดสรรไว้และเคอร์เนลระบบปฏิบัติการตอบสนองโดยการฆ่าโปรแกรมด้วย 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อาจทำงานหรือหน้าคนอาจระบุวิธีการได้รับ)

หวังว่าจะมีคนกลับมาหาคุณในไม่ช้า การยื่นข้อบกพร่องมักเป็นที่นิยม


1
ความผิดพลาดในการแบ่งกลุ่มอาจเกิดขึ้นได้ในภาษาของล่ามด้วย (โดยส่วนใหญ่เป็นเพราะข้อบกพร่องในตัวแปลภาษาเอง)
Braiam

มันมีประโยชน์มาก! มีความเป็นไปได้ที่จะก้าวเข้ามาข้างใน? ใส่เครื่องหมายหยุดและลองค้นหาเพิ่มเติมใช่ไหม
Zloy Smiertniy

1
@ZloySmiertniy gdbทำสิ่งต่างๆมากมาย คุณต้องการคลิกผ่านไปยังส่วน 5.1
goldilocks

11

ซึ่งหมายความว่าแอปพลิเคชันนั้นมีข้อบกพร่อง

  • หากคุณเป็นผู้ใช้ปลายทางคุณควรติดต่อผู้ขายแอปพลิเคชัน

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

    1. เปิดใช้งานไฟล์หลัก: $ ulimit -c unlimited
    2. ทำซ้ำความผิดพลาด: $ ./yourapp
    3. แก้ไขข้อผิดพลาดกับ gdb: $ gdb ./yourapp core

ไฟล์แกนจะเป็นประโยชน์อย่างมากสำหรับนักพัฒนาอื่น ๆ นอกเหนือจากตัวคุณเอง - พวกเขามีสถานะเต็มของโปรแกรมในขณะที่เกิดความผิดพลาด; หากคุณกำลังจะไปรายงานข้อผิดพลาดแนบพวกเขาและในบางกรณีไบนารีแอปของคุณ โปรดทราบว่ามีโอกาสเล็กน้อยที่ข้อมูลส่วนบุคคลของคุณเช่นหมายเลขบัญชีรหัสผ่านและสิ่งที่คล้ายกันอาจยังคงอยู่ในหน่วยความจำของโปรแกรมในขณะที่เกิดความผิดพลาด ในหลายกรณีการรายงาน backtrace ของเธรดที่ล้มเหลวเป็นตัวช่วยที่สำคัญสำหรับนักพัฒนาในการค้นหาปัญหา ในการรับ backtrace คุณสามารถโหลดไฟล์ core ด้วย debugger (เช่นgdb executable corefile)


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

4
ข้อสังเกตของฉันคือคุณภาพของซอฟต์แวร์ Microsoft นั้นต่ำมากในการเปรียบเทียบซอฟต์แวร์ UNIX และเป็นเรื่องดีที่คนทั่วไปในโลก UNIX ไม่ได้อ้างถึงแนวทางของพวกเขา
gena2x
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.