신호 'SIGILL'의 원인은 무엇입니까?


92

NDK 및 GCC를 사용하여 일부 C ++ 코드를 Android로 이식하고 있습니다. 코드는 기본적으로 실행됩니다. 어느 시점에서 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

이상합니다. clang으로 컴파일했을 때 이걸 얻었지만 gcc에서는 잘 작동했습니다
Post Self

22

특히 메모리가 손상된 경우 초기화되지 않은 함수 포인터 일 수 있습니다 (그러면 잘못된 개체에 대한 C ++ 잘못된 포인터의 가짜 vtable이이를 제공 할 수 있습니다).

BTW gdb감시 점 및 추적 점, 그리고 valgrind 도 이러한 문제를 디버깅하는 데 유용 할 수 있습니다 (사용 가능한 경우). 또는 일부 주소 살균제 .


나를 위해 int를 반환해야하는 함수에서 값을 반환하지 않았습니다. 이 답변과 다소 관련이 있습니다. 어떻게 컴파일했는지 알 수 없습니다.
Chris Watts

11

void가 아닌 반환 유형을 가진 모든 함수에 return문 이 있는지 확인합니다 .

일부 컴파일러는 기본 반환 값을 자동으로 제공하지만 다른 컴파일러는 반환 값없이 함수를 종료하려고 할 때 런타임에 SIGILL 또는 SIGTRAP을 보냅니다.


함수에서 누락 된 return 문을 찾기 위해 SIGILL (QT + Android) 뒤에있는 이유를 검색 한 길이를 알 수 없습니다 (답장에서 영감을 얻음). 감사합니다.
Vega4
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.