Apa yang menyebabkan sinyal 'SIGILL'?

92

Saya mem-porting beberapa kode C ++ ke Android menggunakan NDK dan GCC. Kode pada dasarnya berjalan. Pada satu titik, saat melakukan debug di Eclipse, panggilan tersebut

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

menyebabkan kesalahan ini:

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

Apa artinya? Apakah kompiler menghasilkan kode ilegal karena alasan tertentu? Saya memiliki breakpoint di konstruktor (yang tidak melakukan apa-apa), dan tidak terkena. Saya telah melakukan rekondisi penuh.

Apa yang bisa saya lakukan salah yang menyebabkan masalah ini?

Amatir
sumber

Jawaban:

27

Ini berarti CPU mencoba menjalankan instruksi yang tidak dimengerti. Saya kira ini bisa disebabkan oleh korupsi, atau mungkin telah dikompilasi untuk arsitektur yang salah (dalam hal ini saya mengira O / S akan menolak untuk menjalankan executable). Tidak sepenuhnya yakin apa akar masalahnya.

trojanfoe.dll
sumber
24
Penyebab lain dari menjalankan instruksi yang tidak valid adalah melompat ke alamat yang tidak ada di area program.
Paul Nathan
Aneh, saya mendapatkannya, ketika saya mengkompilasi dengan dentang, tetapi berfungsi dengan baik dengan gcc
Post Self
22

Ini bisa berupa beberapa penunjuk fungsi yang tidak diinisialisasi, khususnya jika Anda memiliki memori yang rusak (maka vtable palsu dari C ++ penunjuk buruk ke objek yang tidak valid mungkin memberikannya).

BTW gdbwatchpoints & tracepoints, dan juga valgrind mungkin berguna (jika tersedia) untuk men-debug masalah tersebut. Atau pembersih alamat .

Basile Starynkevitch
sumber
Bagi saya, saya tidak mengembalikan nilai apa pun dari fungsi yang seharusnya mengembalikan int. Jadi agak terkait dengan jawaban ini. Tidak tahu bagaimana itu berhasil dikompilasi.
Chris Watts
11

Pastikan semua fungsi dengan tipe pengembalian non-void memiliki returnpernyataan.

Sementara beberapa kompiler secara otomatis memberikan nilai kembalian default, yang lain akan mengirim SIGILL atau SIGTRAP saat runtime ketika mencoba meninggalkan fungsi tanpa nilai kembalian.

Max Klint
sumber
Anda tidak tahu berapa lama saya mencari alasan di balik SIGILL (QT + Android) hanya untuk menemukan pernyataan pengembalian yang hilang dalam suatu fungsi (terinspirasi oleh balasan Anda). Terima kasih.
Vega4