SEGV_MAPERR là gì?


Câu trả lời:


197

Có hai loại SEGV phổ biến , đó là lỗi do truy cập bộ nhớ không hợp lệ:

  1. Một trang đã được truy cập có quyền sai. Ví dụ: nó ở chế độ chỉ đọc nhưng mã của bạn đã cố gắng ghi vào nó. Điều này sẽ được báo cáo là SEGV_ACCERR .
  2. Một trang được truy cập thậm chí không được ánh xạ vào không gian địa chỉ của ứng dụng. Điều này thường xảy ra do bỏ tham chiếu đến một con trỏ null hoặc một con trỏ bị hỏng với một giá trị số nguyên nhỏ. Điều này được báo cáo là SEGV_MAPERR .

Tài liệu về cách sắp xếp (mã nguồn Linux được lập chỉ mục) cho SEGV_MAPERR có tại đây: http://lxr.free-electrons.com/ident?i=SEGV_MAPERR .


8
Tại sao stackoverflow.com/a/1000010/358475 được đánh dấu là câu trả lời khi câu trả lời này đầy đủ và hữu ích hơn?
OldPeculier

2
Câu hỏi và câu trả lời khác cũ hơn nhiều so với câu trả lời của tôi. Tôi đã chỉnh sửa câu trả lời khác để cải thiện nó ít nhất.
ahcox

Sẽ rất thú vị nếu biết các trường hợp phân biệt chúng với các loại ngoại lệ EXC_BAD_ACCESS. ví dụ: trang được ánh xạ nhưng không được phân bổ (/ gần đây đã được phân bổ)?
Bobjt

6
Một ví dụ về SEGV_MAPERRlà tràn ngăn xếp (không có ý định chơi chữ). : D
Antti Haapala

2
Thậm chí còn có SEGV nhiều loại: elixir.free-electrons.com/linux/latest/source/include/uapi/...
Tomasz

40

Đó là một lỗi phân đoạn. Hầu hết có lẽ là vấn đề con trỏ treo hoặc một số loại tràn bộ đệm.

SIGSSEGV là tín hiệu kết thúc nó dựa trên sự cố, lỗi phân đoạn.

Kiểm tra các con trỏ treo cũng như vấn đề tràn.

Kích hoạt bãi chứa lõi sẽ giúp bạn xác định vấn đề.

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.