2011-08-20 21 views
18

Vì mục đích gỡ lỗi, tôi cần kiểm tra con trỏ để xem địa chỉ có trỏ đến trang có thể đọc hợp lệ hay không. Hiện tại tôi đang phân tích cú pháp/proc/[pid]/maps để xem địa chỉ có được ánh xạ không, nhưng điều này có vẻ hơi dài một chút. Có cách nào tốt hơn? Cảm ơn.Cách kiểm tra xem địa chỉ có thể đọc được trong ứng dụng không gian người dùng Linux

+1

Tôi đang thực hiện phân tích cú pháp '/ proc/self/maps' là –

+0

@GregoryPakosz: Để trở thành giải pháp chung & đáng tin cậy, không yêu cầu tải lại và sửa lại bản đồ trên mọi séc để giải thích mọi thứ giống như một phân vùng phát triển hoặc phân đoạn bộ nhớ mới được ánh xạ? – etherice

+0

@etherice: Không vì/proc tự làm mới; mỗi khi bạn truy cập vào một/proc tập tin (s), mã hạt nhân chạy mà tái tạo nó là "nội dung". – kaiwan

Trả lời

17

Cách kinh điển là sử dụng lệnh gọi hệ thống write() để đọc từ trang này (ghi vào bộ mô tả tệp giả) pipe(). Thay vì bị lỗi, nó sẽ trả lại -1 với errno == EFAULT nếu bộ đệm được ghi là không đọc được.

+0

Cảm ơn, điều này làm việc một điều trị! – gimmeamilk

+3

Cảnh báo: Đã xem ít nhất một giải pháp SO khác đề xuất sử dụng/dev/null cho mục đích này (http://stackoverflow.com/questions/4611776/isbadreadptr-analogue-on-unix), nhưng các hạt nhân mới hơn (tôi đã thử nghiệm trên 3.8 .7) trả về thành công cho/dev/null write() ngay cả khi 'buf' là NULL. Vì vậy, trong khi thử nghiệm này có thể làm việc với/dev/null trên hệ thống nào bạn đang thử nghiệm, nó chắc chắn không phải là một giải pháp di động. Sử dụng một số fd khác (như một đường ống giả hoặc đối tượng shix posix) sẽ không được nhanh chóng nhưng nó chắc chắn sẽ an toàn hơn và di động hơn. – etherice

Các vấn đề liên quan