Nguyên nhân gây ra tín hiệu 'SIGILL'?


90

Tôi đang chuyển một số mã C ++ sang Android bằng NDK và GCC. Về cơ bản, mã chạy. Tại một thời điểm, khi gỡ lỗi trong Eclipse, lệnh 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 đã tạo ra mã bất hợp pháp vì lý do nào đó? Tôi có một điểm ngắt trong hàm tạo (không làm gì cả) và nó không bị đánh. Tôi đã thực hiện xây dựng lại toàn bộ.

Tôi có thể làm gì sai để gây ra vấn đề này?

Câu trả lời:


27

Nó có nghĩa là CPU đã cố gắng thực hiện một lệnh mà nó không hiểu. Điều này có thể được gây ra bởi lỗi mà tôi đoán, hoặc có thể nó được biên dịch cho sai kiến ​​trúc (trong trường hợp đó, tôi đã nghĩ O / S sẽ từ chối chạy tệp thực thi). Không hoàn toàn chắc chắn vấn đề gốc là gì.


24
Một nguyên nhân khác của việc thực thi một lệnh không hợp lệ là nhảy đến một địa chỉ không có trong vùng chương trình.
Paul Nathan

Weird, tôi nhận được điều này, khi tôi biên soạn với kêu vang, nhưng nó làm việc tốt với gcc
bài viết Tự

22

Nó có thể là một số con trỏ hàm chưa được khởi tạo, đặc biệt nếu bạn có bộ nhớ bị hỏng (khi đó vtable không có thật của C ++ con trỏ xấu đến các đối tượng không hợp lệ có thể cho điều đó).

gdbĐiểm theo dõi & điểm theo dõi BTW và cả valgrind có thể hữu ích (nếu có) để gỡ lỗi các vấn đề như vậy. Hoặc một số chất khử trùng địa chỉ .


Đối với tôi, tôi đã không trả về bất kỳ giá trị nào từ một hàm được cho là trả về một số nguyên. Vì vậy, phần nào liên quan đến câu trả lời này. Không có ý tưởng làm thế nào nó quản lý để biên dịch.
Chris Watts

11

Đảm bảo rằng tất cả các hàm có kiểu trả về không void đều có một returncâu lệnh.

Trong khi một số trình biên dịch tự động cung cấp giá trị trả về mặc định, những trình biên dịch khác sẽ gửi một SIGILL hoặc SIGTRAP trong thời gian chạy khi cố gắng rời khỏi một hàm mà không có giá trị trả về.


Bạn không biết tôi đã mất bao lâu để tìm kiếm lý do đằng sau SIGILL (QT + Android) chỉ để tìm câu lệnh trả về bị thiếu trong một hàm (lấy cảm hứng từ câu trả lời của bạn). Cảm ơn bạn.
Vega4
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.