Programing

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

crosscheck 2020. 9. 20. 08:46
반응형

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


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

그게 무슨 뜻입니까? 컴파일러가 어떤 이유로 잘못된 코드를 생성 했습니까? 생성자에 중단 점이 있는데 (아무것도 수행하지 않음) 맞지 않습니다. 이미 전체 재 구축을 완료했습니다.

이 문제를 일으키기 위해 내가 뭘 잘못하고있을 수 있습니까?


이제 작동합니다. Android / NDK / GCC / Eclipse로 어려움을 겪는 다른 사람을 위해 해결 방법은 다음과 같습니다.

  1. 보름달이되면 자정에 죽은 고양이를 묻어
  2. Android 기기 에뮬레이터 다시 시작

두 단계가 실제로 필요한지, 그렇지 않은 경우 어느 것이 중복되는지 확인하지 않았습니다.


이는 CPU가 이해하지 못한 명령을 실행하려고 시도했음을 의미합니다. 이것은 내가 추측하는 손상으로 인해 발생하거나 잘못된 아키텍처 용으로 컴파일되었을 수 있습니다 (이 경우 O / S가 실행 파일 실행을 거부 할 것이라고 생각했을 것입니다). 근본 문제가 무엇인지 완전히 확실하지 않습니다.


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

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


gcc에서 clang으로 코드를 마이그레이션하고 일부 함수의 마지막 문에서 SIGILL 또는 SIGTRAP를 가져 오기 시작하는 return경우 함수가 무효가 아닌 반환 유형으로 선언 된 경우 해당 함수에 이 있는지 확인합니다 .

참고 URL : https://stackoverflow.com/questions/7901867/what-causes-signal-sigill

반응형