O que causa o sinal 'SIGILL'?


90

Estou portando algum código C ++ para Android usando NDK e GCC. O código basicamente é executado. Em um ponto, ao depurar no Eclipse, a chamada

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

causa este erro:

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

O que isso significa? O compilador gerou código ilegal por algum motivo? Eu tenho um ponto de interrupção no construtor (que não faz nada) e não é atingido. Já fiz uma reconstrução completa.

O que posso estar fazendo de errado para causar esse problema?

Respostas:


27

Significa que a CPU tentou executar uma instrução que não entendeu. Isso pode ser causado por corrupção, eu acho, ou talvez ele tenha sido compilado para a arquitetura errada (nesse caso, eu teria pensado que o O / S se recusaria a executar o executável). Não tenho certeza de qual é a raiz do problema.


24
Outra causa de execução de uma instrução inválida é pular para um endereço que não está na área do programa.
Paul Nathan

Estranho, entendi quando compilei com o clang, mas funcionou bem com gcc
Post Self

22

Pode ser algum ponteiro de função não inicializado, em particular se você tiver corrompido a memória (então a tabela vtable de ponteiros ruins C ++ para objetos inválidos pode fornecer isso).

BTW gdbwatchpoints & tracepoints, e também valgrind podem ser úteis (se disponível) para depurar tais problemas. Ou algum desinfetante de endereços .


Para mim, eu não estava retornando nenhum valor de uma função que deveria retornar um int. Então, de alguma forma relacionado a esta resposta. Não tenho ideia de como ele conseguiu compilar.
Chris Watts

11

Certifique-se de que todas as funções com tipo de retorno não nulo tenham uma returninstrução.

Enquanto alguns compiladores fornecem automaticamente um valor de retorno padrão, outros enviarão um SIGILL ou SIGTRAP em tempo de execução ao tentar deixar uma função sem um valor de retorno.


Você não tem ideia de até que ponto procurei um motivo por trás do SIGILL (QT + Android) apenas para encontrar uma instrução de retorno ausente em uma função (inspirado em sua resposta). Obrigado.
Vega4
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.