อะไรทำให้เกิดสัญญาณ 'SIGILL'


92

ฉันกำลังโอนรหัส C ++ ไปยัง Android โดยใช้ NDK และ GCC โดยทั่วไปโค้ดจะทำงาน จนถึงจุดหนึ่งเมื่อทำการดีบักใน Eclipse การเรียกใช้

Dabbler::Android::Factory* pFactory = new Dabbler::Android::Factory;

ทำให้เกิดข้อผิดพลาดนี้:

Thread [1] (Suspended: Signal 'SIGILL' received. Description: Illegal instruction.) 
    1 <symbol is not available> 0x812feb44

นั่นหมายความว่าอย่างไร? คอมไพเลอร์สร้างรหัสที่ผิดกฎหมายด้วยเหตุผลบางประการหรือไม่? ฉันมีเบรกพอยต์ในตัวสร้าง (ซึ่งไม่ทำอะไรเลย) และมันไม่โดน ฉันได้ทำการสร้างใหม่ทั้งหมดแล้ว

ฉันทำอะไรผิดที่ทำให้เกิดปัญหานี้

คำตอบ:


27

หมายความว่า CPU พยายามดำเนินการตามคำสั่งที่ไม่เข้าใจ สิ่งนี้อาจเกิดจากความเสียหายที่ฉันเดาหรืออาจจะถูกคอมไพล์สำหรับสถาปัตยกรรมที่ไม่ถูกต้อง (ซึ่งในกรณีนี้ฉันคิดว่า O / S จะปฏิเสธที่จะเรียกใช้ปฏิบัติการ) ไม่แน่ใจว่าปัญหารากคืออะไร


24
อีกสาเหตุหนึ่งของการดำเนินการคำสั่งที่ไม่ถูกต้องคือการข้ามไปยังที่อยู่ที่ไม่ได้อยู่ในพื้นที่โปรแกรม
Paul Nathan

แปลกฉันได้สิ่งนี้เมื่อฉันรวบรวมด้วยเสียงดัง แต่มันใช้งานได้ดีกับ gcc
Post Self

22

อาจเป็นตัวชี้ฟังก์ชันที่ไม่ได้เตรียมใช้งานโดยเฉพาะอย่างยิ่งหากคุณมีหน่วยความจำที่เสียหาย (จากนั้นตัวชี้ที่ไม่ถูกต้องของ C ++ ปลอมสำหรับวัตถุที่ไม่ถูกต้องอาจให้สิ่งนั้น)

BTW gdbwatchpoints & tracepoints และvalgrindอาจมีประโยชน์ (ถ้ามี) ในการแก้ปัญหาดังกล่าว หรือบางเจลทำความสะอาดอยู่


สำหรับฉันฉันไม่ได้ส่งคืนค่าใด ๆ จากฟังก์ชันที่ควรจะคืนค่า int ค่อนข้างเกี่ยวข้องกับคำตอบนี้ ไม่รู้ว่ามันจัดการคอมไพล์อย่างไร
Chris Watts

11

ตรวจสอบให้แน่ใจว่าฟังก์ชันทั้งหมดที่มีประเภทการส่งคืนที่ไม่ใช่โมฆะมีreturnคำสั่ง

แม้ว่าคอมไพเลอร์บางตัวจะให้ค่าส่งคืนเริ่มต้นโดยอัตโนมัติ แต่คอมไพเลอร์อื่น ๆ จะส่ง SIGILL หรือ SIGTRAP ขณะรันไทม์เมื่อพยายามออกจากฟังก์ชันโดยไม่มีค่าส่งคืน


คุณไม่รู้หรอกว่าฉันไปค้นหาเหตุผลเบื้องหลัง SIGILL (QT + Android) มานานแค่ไหนเพียงเพื่อค้นหาคำสั่งส่งคืนที่ขาดหายไปในฟังก์ชัน (ได้รับแรงบันดาลใจจากการตอบกลับของคุณ) ขอบคุณ.
Vega4
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.