2011-01-24 24 views
8

Toàn bộ mã kiểm tra được chứa trong main.cpp như sau:Tại sao valgrind không phát hiện rò rỉ bộ nhớ trong chương trình "thử nghiệm" của tôi?

#include <iostream> 

using std::cout; 
using std::endl; 

void f(int i) { 
    int* pi = new int; 

    *pi = i; 

    std::cout << "*pi = " << *pi << std::endl; 
} 

int main(int argc, char *argv[]) { 
    int i = 0; 

    while (i < 10000) { 
     f(i); 
     ++i; 
    } 

    return 0; 
} 

tôi biên dịch không có tối ưu hóa -O0 (từ một dự án Eclipse Qt) với:

g++ -c -pipe -O0 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -Irelease -o release/main.o main.cpp 

sau đó liên kết như sau:

g++ -Wl,-O0 -o test release/main.o -L/usr/lib -lQtGui -lQtCore -lpthread 

Tôi chạy tệp thực thi thông qua valgrind và nhận được kết quả sau:

laptop:~/workspace/test$ valgrind --leak-check=yes test 
==3939== Memcheck, a memory error detector 
==3939== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al. 
==3939== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info 
==3939== Command: test 
==3939== 
==3939== 
==3939== HEAP SUMMARY: 
==3939==  in use at exit: 0 bytes in 0 blocks 
==3939== total heap usage: 1,387 allocs, 1,387 frees, 64,394 bytes allocated 
==3939== 
==3939== All heap blocks were freed -- no leaks are possible 
==3939== 
==3939== For counts of detected and suppressed errors, rerun with: -v 
==3939== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 13 from 8) 

Tôi tin valgrind nên báo cáo rò rỉ bộ nhớ hơn là không có rò rỉ có thể xảy ra vì bộ nhớ heap phân bổ trong các cuộc gọi đến new int

EDIT: Thay đổi mã trên sử dụng std :: cout hơn qDebug() với cùng kết quả

Nếu tôi biên dịch và liên kết cùng mã (từ một dự án Eclipse CDT) mà không phụ thuộc Qt, valgrind phát hiện rò rỉ:

g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"main.d" -MT"main.d" -o"main.o" "../main.cpp" 

g++ -o"test2" ./main.o 

==4604== HEAP SUMMARY: 
==4604==  in use at exit: 40,000 bytes in 10,000 blocks 
==4604== total heap usage: 10,000 allocs, 0 frees, 40,000 bytes allocated 
==4604== 
==4604== 40,000 bytes in 10,000 blocks are definitely lost in loss record 1 of 1 
==4604== at 0x402569A: operator new(unsigned int) (vg_replace_malloc.c:255) 
==4604== by 0x8048756: f(int) (main.cpp:7) 
==4604== by 0x80487BB: main (main.cpp:18) 
==4604== 
==4604== LEAK SUMMARY: 
==4604== definitely lost: 40,000 bytes in 10,000 blocks 
==4604== indirectly lost: 0 bytes in 0 blocks 
==4604==  possibly lost: 0 bytes in 0 blocks 
==4604== still reachable: 0 bytes in 0 blocks 
==4604==   suppressed: 0 bytes in 0 blocks 
==4604== 
==4604== For counts of detected and suppressed errors, rerun with: -v 
==4604== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 19 from 8) 

tôi u hát Kubuntu 10.04 32 bit và đã thử cả hai bản xây dựng Debug và Release, tôi đang làm gì sai hoặc tại sao không valgrind báo cáo rò rỉ bộ nhớ khi liên kết với Qt?

+0

Có thể trình biên dịch đã loại bỏ mã đó vì nó coi nó không có hiệu lực? – sharptooth

+0

@sharptooth: Tôi không nghĩ vậy vì trong chế độ gỡ lỗi qDebug ghi vào stdout mà là một tác dụng phụ nên ngăn chặn trình biên dịch loại bỏ? Tôi cũng đã cố gắng 'std :: cout' thay vì' qDebug' (mà các cuộc gọi đến được gỡ bỏ trong bản phát hành) và nhận được kết quả tương tự. Bạn có nhận được kết quả tương tự như tôi không? –

+0

Tôi chưa thử mã đó. Tuy nhiên với tôi nó trông giống như rò rỉ nên được báo cáo và tôi có thể giả sử hai lý do cho nó không được báo cáo - tối ưu hóa trình biên dịch hoặc một cái gì đó đặc biệt với thực hiện đống mà can thiệp với valgrind. – sharptooth

Trả lời

17

Lý do điều này xảy ra là các cuộc gọi đến:

valgrind --leak-check=yes test 

thực sự đang chạy valgrind trên/usr/bin/test là chương trình tích hợp kiểm tra loại tệp và so sánh giá trị, tất cả những gì tôi cần là:

valgrind --leak-check=yes ./test 
+0

+1 bắt tốt !! –

0

tôi đã thay thế qDebug() với std :: cout:

==2426== HEAP SUMMARY: 
==2426==  in use at exit: 40,000 bytes in 10,000 blocks 
==2426== total heap usage: 10,000 allocs, 0 frees, 40,000 bytes allocated 
==2426== 
==2426== LEAK SUMMARY: 
==2426== definitely lost: 39,996 bytes in 9,999 blocks 
+0

Không có gì thay đổi khi tôi sử dụng các tùy chọn mã và trình biên dịch của bạn. Có lẽ đó là lỗi của Eclipse. – knivil

0

lẽ trình biên dịch của bạn loại bỏ sự mã trong việc tối ưu hóa, hãy thử biên dịch với -O0 (không có tùy chọn tối ưu).

Như nhận xét, với debian lenny với -O2, rò rỉ được phát hiện:

==20547== LEAK SUMMARY: 
==20547== definitely lost: 40,000 bytes in 10,000 blocks. 
==20547==  possibly lost: 0 bytes in 0 blocks. 
==20547== still reachable: 516 bytes in 7 blocks. 
==20547==   suppressed: 0 bytes in 0 blocks. 
==20547== Rerun with --leak-check=full to see details of leaked memory. 

Trình biên dịch:

gcc version 4.3.2 (Debian 4.3.2-1.1) 
+0

@peter Tôi liên kết với qt. –

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