Tôi đang chuyển một số mã C ++ sang Android bằng NDK và GCC. Mã cơ bản chạy. Tại một thời điểm, khi gỡ lỗi trong Eclipse, cuộc gọi
Dabbler::Android::Factory* pFactory = new Dabbler::Android::Factory;
gây ra lỗi này:
Thread [1] (Suspended: Signal 'SIGILL' received. Description: Illegal instruction.)
1 <symbol is not available> 0x812feb44
Điều đó nghĩa là gì? Trình biên dịch có tạo ra mã bất hợp pháp vì một lý do nào đó không? Tôi có một breakpoint trong constructor (mà không có gì), và nó không phải là hit. Tôi đã làm xong việc xây dựng lại.
Tôi có thể làm gì sai khi gây ra vấn đề này?
Nó hoạt dộng bây giờ. Đối với bất kỳ ai khác đấu tranh với Android / NDK / GCC / Eclipse, đây là cách tôi đã giải quyết nó:
- Chôn một con mèo chết vào lúc nửa đêm khi trăng tròn
- Khởi động lại trình mô phỏng thiết bị Android
Chưa được xác minh nếu cả hai bước thực sự cần thiết và nếu không, bước nào là thừa.
Nó có nghĩa là CPU đã cố thực thi một lệnh mà nó không hiểu. Điều này có thể được gây ra bởi tham nhũng tôi đoán, hoặc có thể nó được biên dịch cho kiến trúc sai (trong trường hợp này tôi có thể nghĩ rằng O / S sẽ từ chối chạy thực thi). Không hoàn toàn chắc chắn vấn đề gốc là gì.
Nó có thể là một số con trỏ hàm không khởi tạo, đặc biệt nếu bạn có bộ nhớ bị hỏng (sau đó vtable vtable của C + + con trỏ xấu cho các đối tượng không hợp lệ có thể cung cấp cho điều đó).
BTW gdb
điểm quan sát và tracepoints, và cũng valgrind có thể hữu ích (nếu có) để gỡ lỗi các vấn đề đó. Hoặc một số địa chỉ sanitizer.