'SIGILL' sinyaline ne sebep olur?


92

NDK ve GCC kullanarak bazı C ++ kodunu Android'e aktarıyorum. Kod temelde çalışır. Bir noktada, Eclipse'de hata ayıklarken, çağrı

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

bu hataya neden olur:

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

Bu ne anlama geliyor? Derleyici herhangi bir nedenle yasadışı kod üretti mi? Yapıcıda (hiçbir şey yapmayan) bir kesme noktam var ve vurulmadı. Zaten tam bir yeniden inşa yaptım.

Bu soruna neden olacak neyi yanlış yapabilirim?

Yanıtlar:


27

CPU'nun anlamadığı bir talimatı yerine getirmeye çalıştığı anlamına gelir. Bu, tahmin ettiğim yolsuzluktan kaynaklanıyor olabilir veya belki de yanlış mimari için derlenmiş olabilir (bu durumda, O / S'nin yürütülebilir dosyayı çalıştırmayı reddedeceğini düşünürdüm). Kök sorunun ne olduğundan tam olarak emin değilim.


24
Geçersiz bir talimatın yürütülmesinin bir başka nedeni, program alanında olmayan bir adrese atlamaktır.
Paul Nathan

Garip, bunu clang ile derlediğimde anladım, ancak gcc ile iyi çalıştı
Post Self

22

Bu bazı başlatılmamış işlev işaretçisi olabilir, özellikle hafızayı bozduysanız (o zaman C ++ 'ın sahte vtable'ı geçersiz nesnelere kötü işaretçiler verebilir).

BTW gdbwatchpoints & tracepoints ve ayrıca valgrind tür sorunları hata ayıklamak için (varsa) faydalı olabilir. Veya bir adres dezenfektanı .


Benim için, int döndürmesi gereken bir işlevden herhangi bir değer döndürmüyordum. Yani biraz bu cevapla ilgili. Nasıl derlemeyi başardığı hakkında hiçbir fikrim yok.
Chris Watts

11

Geçersiz dönüş türü olmayan tüm işlevlerin bir returndeyime sahip olduğundan emin olun .

Bazı derleyiciler otomatik olarak varsayılan bir dönüş değeri sağlarken, diğerleri bir işlevi dönüş değeri olmadan bırakmaya çalışırken çalışma zamanında bir SIGILL veya SIGTRAP gönderir.


SIGILL'in (QT + Android) bir işlevde eksik bir dönüş ifadesini (cevabınızdan esinlenerek) bulmak için neden aradığımı bilmiyorsunuz. Teşekkür ederim.
Vega4
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.