2012-06-12 21 views
6

tôi nhận thức "thực hiện" Thông điệp của tôi với valgrind, và nhận được báo cáo cảnh này:Segfaulting chỉ mà không valgrind

==3434== HEAP SUMMARY: 
==3434==  in use at exit: 8,432 bytes in 4 blocks 
==3434== total heap usage: 4,369 allocs, 8,037 frees, 377,356 bytes allocated 
==3434== 
==3434== LEAK SUMMARY: 
==3434== definitely lost: 152 bytes in 1 blocks 
==3434== indirectly lost: 0 bytes in 0 blocks 
==3434==  possibly lost: 0 bytes in 0 blocks 
==3434== still reachable: 8,192 bytes in 2 blocks 
==3434==   suppressed: 88 bytes in 1 blocks 
==3434== Rerun with --leak-check=full to see details of leaked memory 
==3434== 
==3434== For counts of detected and suppressed errors, rerun with: -v 
==3434== ERROR SUMMARY: 100190 errors from 140 contexts (suppressed: 0 from 0) 

Nhưng khi tôi chạy nó mà không valgrind, nó segfaults ngay lập tức. Liệu valgrind có ngăn chặn một loại lỗi nhất định mà tôi nên tìm kiếm không? Tôi không thể tìm thấy bất kỳ thông tin nào về việc này trực tuyến

+1

Bất kỳ "đọc không hợp lệ" hoặc "ghi không hợp lệ" trong đầu ra valgrind? –

+0

tấn. Những thứ đó phải xấu. – SetSlapShot

+2

Đúng. Họ có nghĩa là bạn đang đọc hoặc viết bộ nhớ không phải của bạn. Phải sửa tất cả. –

Trả lời

4

Valgrind chạy chương trình trong một môi trường khác với nếu bạn chạy chương trình từ trình bao. Điều này có thể ngăn ngừa một số sự cố khi liên quan đến cạn kiệt bộ nhớ hoặc sắp xếp mảng.

Chỉnh sửa 140 ngữ cảnh lỗi và bạn sẽ không sao.

3

Memcheck không thực hiện kiểm tra giới hạn đầy đủ và vì nó có bộ cấp phát bộ nhớ riêng, nó có thể ngăn chặn các lỗi mà bạn sẽ nhận được. Thay vào đó hãy sử dụng trình gỡ lỗi.

1

Một ví dụ về lỗi đôi khi không bị Valgrind bắt gặp là khi bạn giải phóng bộ nhớ và sau đó tham khảo nó thông qua một con trỏ khác cũng trỏ đến cùng một vị trí.

Tôi không chắc tại sao điều này lại xảy ra. Có lẽ môi trường Valgrind xử lý phân bổ bộ nhớ và deallocation khác nhau. [Như Eregrith nói]

Cách nhanh chóng để kiểm tra điều này là tạm thời nhận xét các cuộc gọi hàm miễn phí() của bạn và xem liệu cuộc gọi đó có còn phân biệt hay không. [Uncomment chúng sau này, một khi bạn sửa chữa chúng!]

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