EXC_I386_GPFLT chắc chắn đang đề cập đến "Lỗi bảo vệ chung", đó là cách x86 cho bạn biết rằng "bạn đã làm điều gì đó mà bạn không được phép làm". Thông thường KHÔNG có nghĩa là bạn truy cập ngoài giới hạn bộ nhớ, nhưng có thể là mã của bạn đang vượt quá giới hạn và khiến mã / dữ liệu xấu được sử dụng theo cách gây ra vi phạm bảo vệ ở một số loại.
Thật không may, thật khó để tìm ra chính xác vấn đề là gì nếu không có thêm ngữ cảnh, có 27 nguyên nhân khác nhau được liệt kê trong Sách hướng dẫn lập trình viên AMD64 của tôi, Tập 2 từ năm 2005 - theo tất cả các tài khoản, có lẽ 8 năm sau sẽ có thêm một vài nguyên nhân hơn.
Nếu đó là hệ thống 64 bit, một tình huống hợp lý là mã của bạn đang sử dụng "con trỏ không chuẩn" - nghĩa là địa chỉ 64 bit được tạo theo cách mà 16 bit phía trên của địa chỉ không tất cả các bản sao trên cùng của 48 bit thấp hơn (nói cách khác, 16 bit trên cùng của một địa chỉ tất cả phải là 0 hoặc tất cả là 1, dựa trên bit ngay dưới 16 bit). Quy tắc này được đặt ra để đảm bảo rằng kiến trúc có thể "mở rộng một cách an toàn số lượng bit hợp lệ trong dải địa chỉ". Điều này sẽ chỉ ra rằng mã đang ghi đè một số dữ liệu con trỏ bằng những thứ khác hoặc đi ra ngoài giới hạn khi đọc một số giá trị con trỏ.
Một nguyên nhân có khả năng khác là truy cập không được căn chỉnh với thanh ghi SSE - nói cách khác, đọc một thanh ghi SSE 16 byte từ một địa chỉ không được căn chỉnh 16 byte.
Như tôi đã nói, có nhiều lý do có thể khác, nhưng hầu hết những lý do đó liên quan đến những thứ mà mã "bình thường" sẽ không thực hiện được trong hệ điều hành 32 hoặc 64-bit (chẳng hạn như tải các thanh ghi phân đoạn có chỉ mục bộ chọn không hợp lệ hoặc ghi vào MSR's (thanh ghi mô hình cụ thể)).