신호 '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로 어려움을 겪는 다른 사람을 위해 해결 방법은 다음과 같습니다.
- 보름달이되면 자정에 죽은 고양이를 묻어
- Android 기기 에뮬레이터 다시 시작
두 단계가 실제로 필요한지, 그렇지 않은 경우 어느 것이 중복되는지 확인하지 않았습니다.
이는 CPU가 이해하지 못한 명령을 실행하려고 시도했음을 의미합니다. 이것은 내가 추측하는 손상으로 인해 발생하거나 잘못된 아키텍처 용으로 컴파일되었을 수 있습니다 (이 경우 O / S가 실행 파일 실행을 거부 할 것이라고 생각했을 것입니다). 근본 문제가 무엇인지 완전히 확실하지 않습니다.
특히 메모리가 손상된 경우 초기화되지 않은 함수 포인터 일 수 있습니다 (그러면 잘못된 개체에 대한 C ++ 잘못된 포인터의 가짜 vtable이이를 제공 할 수 있습니다).
BTW gdb
감시 점 및 추적 점, 또한 Valgrind의 이러한 문제를 디버깅 (사용 가능한 경우) 유용 할 수 있습니다. 또는 일부 주소 살균제 .
gcc에서 clang으로 코드를 마이그레이션하고 일부 함수의 마지막 문에서 SIGILL 또는 SIGTRAP를 가져 오기 시작하는 return
경우 함수가 무효가 아닌 반환 유형으로 선언 된 경우 해당 함수에 문 이 있는지 확인합니다 .
참고 URL : https://stackoverflow.com/questions/7901867/what-causes-signal-sigill
'Programing' 카테고리의 다른 글
Facebook Graph API : 한 번의 요청으로 더 큰 사진 가져 오기 (0) | 2020.09.20 |
---|---|
UIView에서 선 그리기 (0) | 2020.09.20 |
시퀀스 된 상태 전환 스트림으로 작성된 프로그램을 scalaz-stream으로 어떻게 대체합니까? (0) | 2020.09.20 |
이 GHC 핵심 "증거"를 읽는 방법? (0) | 2020.09.20 |
Android의 모바일 웹 사이트에서 숫자로 키보드를 강제하는 방법 (0) | 2020.09.19 |