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?

Dabbler
fonte

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.

trojanfoe
fonte
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 .

Basile Starynkevitch
fonte
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.

Max Klint
fonte
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