Câu hỏi Điều gì gây ra tín hiệu 'SIGILL'?


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?


75
2017-10-26 11:17


gốc




Các câu trả lời:


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ó:

  1. Chôn một con mèo chết vào lúc nửa đêm khi trăng tròn
  2. 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.


634
2017-10-26 12:02



Phần khởi động lại có vẻ không đáng kể. - Bartek Skwira


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ì.


19
2017-10-26 11:20



Một nguyên nhân khác của việc thực hiện một lệnh không hợp lệ là nhảy đến một địa chỉ không nằm trong vùng chương trình. - Paul Nathan
Thật lạ lùng, tôi nhận được điều này, khi tôi biên dịch với tiếng kêu vang, nhưng nó hoạt động tốt với gcc - Post Self


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.


18
2017-10-26 11:31