2010-09-28 18 views
12

Gần đây tôi đã phát triển một thói quen chạy tất cả các chương trình của mình thông qua valgrind để kiểm tra rò rỉ bộ nhớ, nhưng hầu hết kết quả của nó hơi khó hiểu đối với tôi.Lỗi Valgrind mặc dù tất cả các khối đống đã được giải phóng

Đối với chạy mới nhất của tôi, đã cho tôi valgrind -v:

All heap blocks were freed -- no leaks are possible 

Điều đó có nghĩa chương trình của tôi được bảo hiểm cho bộ nhớ rò rỉ, phải không?

Lỗi này có nghĩa là gì? Chương trình của tôi có đọc chính xác các khối bộ nhớ không?

ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 14 from 9) 

1 errors in context 1 of 1: 
Invalid read of size 4 
    at 0x804885B: findPos (in /home/a.out) 
    by 0xADD918: start_thread (pthread_create.c:301) 
    by 0xA26CCD: clone (clone.S:133) 
Address 0x4a27108 is 0 bytes after a block of size 40 alloc'd 
    at 0x4005BDC: malloc (vg_replace_malloc.c:195) 
    by 0x804892F: readInput (in /home/a.out) 
    by 0xADD918: start_thread (pthread_create.c:301) 
    by 0xA26CCD: clone (clone.S:133) 

used_suppression:  14 dl-hack3-cond-1 

Ngoài ra, các lỗi "bị chặn" ở đây là gì?

Trả lời

12
  1. Có, bạn được bảo hiểm rất nhiều, không nghĩ rằng valgrind có thể dễ dàng bỏ lỡ một sự rò rỉ trong mã sử dụng
  2. lỗi của bạn có nghĩa là bạn có thể có một lỗi 1 trong lập chỉ mục một mảng biến . các dòng valgrind cho bạn biết phải chính xác, vì vậy bạn nên dễ dàng thấy rằng, với điều kiện bạn biên dịch tất cả các mã của bạn với -g
  3. lỗi đè nén thường từ thư viện hệ thống, mà đôi khi có rò rỉ nhỏ hoặc những thứ undectable như nhà nước biến của chủ đề. trang hướng dẫn của bạn nên liệt kê tệp nén được sử dụng theo mặc định
+0

Đây là một trong những lỗi bị chặn, nó chỉ cho tôi "1 lỗi bị chặn" khi tôi sử dụng valgrind mà không có -v. Vì vậy, nó không phải là đau đầu của tôi, phải không? –

+1

@crypto: bạn có nghĩa là lỗi trong 'findPos'? Không cái này là thật, đây là mã của bạn đang làm điều gì đó sai. Nếu không có mã chính nó tôi chỉ có thể đoán, nhưng từ việc đặt tên của chức năng tôi đoán rằng điều này quét một mảng và chạy vượt ra ngoài giới hạn phân bổ trong một số trường hợp biên giới. Biên dịch với '-g' và valgrind sẽ cho bạn biết dòng chính xác. –

+0

Nhưng vị trí cuối cùng của lỗi được ghi là clone.S, mà tôi không kiểm soát được. –

18

Điều này có vẻ hiển nhiên ... nhưng có thể đáng để chỉ ra rằng thông báo "no leaks are possible" không có nghĩa là chương trình của bạn không bị rò rỉ; nó chỉ có nghĩa là nó không bị rò rỉ trong cấu hình mà nó được kiểm tra.

Nếu tôi chạy phần sau với valgrind mà không có tham số dòng lệnh, nó sẽ thông báo cho tôi rằng không có rò rỉ nào. Nhưng nó bị rò rỉ nếu tôi cung cấp một tham số dòng lệnh.

int main(int argc, char* argv[]) 
{ 
    if (argc > 1) 
     malloc(5); 
    printf("Enter any command line arg to cause a leak\n"); 
} 
+1

+1 nhận xét tốt! –

1

Kiểm tra rò rỉ bộ nhớ là một trong những lý do để sử dụng valgrind, nhưng tôi muốn nói một lý do tốt hơn là để tìm lỗi nghiêm trọng hơn trong mã của bạn, chẳng hạn như sử dụng một mảng subscript không hợp lệ hoặc dereferencing một con trỏ chưa được khởi tạo hoặc một con trỏ để giải phóng bộ nhớ. Nó là tốt nếu valgrind nói với bạn rằng các đường dẫn mã bạn thực hiện trong khi chạy valgrind không dẫn đến rò rỉ bộ nhớ, nhưng đừng để điều đó khiến bạn bỏ qua các báo cáo về các lỗi nghiêm trọng hơn, chẳng hạn như lỗi bạn đang sử dụng nhìn thấy ở đây.

Như đã đề xuất khác, chạy lại valgrind sau khi biên dịch với thông tin gỡ lỗi (-g) sẽ là bước tiếp theo tốt.

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