2010-09-28 16 views
12

Niedawno opracowałem nawyk uruchamiania wszystkich moich programów przez valgrind, aby sprawdzić wycieki pamięci, ale większość jej wyników była dla mnie trochę zagadkowa.Błędy Valgrind, mimo że wszystkie bloki sterty zostały zwolnione.

Dla mojego ostatniego biegu, valgrind -v dał mi:

All heap blocks were freed -- no leaks are possible 

Oznacza to, że mój program objęła dla pamięci przecieki, prawda?

Co oznacza ten błąd? Czy mój program nie odczytuje poprawnie niektórych bloków pamięci?

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 

Co to są tak zwane "tłumione" błędy?

Odpowiedz

12
  1. Tak, są znacznie pokryte, nie zdaniem valgrind łatwo można przegapić przeciek w kodzie użytkownika
  2. Twój błąd oznacza, że ​​prawdopodobnie mają błąd +1 w Indeksowanie zmienną tablicową . linie, które valgrind zasugerować, powinny być dokładne, więc powinien łatwo zauważyć, że pod warunkiem, skompilować cały swój kod z -g
  3. stłumionych błędów są zazwyczaj z bibliotek systemowych, które czasami mają małe nieszczelności lub niewykrywalnych rzeczy jak państwa zmienne wątków. Twoja strona podręcznika powinna zawierać domyślny plik tłumienia, który jest domyślnie używany:
+0

Jest to jeden z pominiętych błędów, po prostu dał mi "1 błąd pomijany", gdy użyłem valgrind bez -v. Więc to nie jest mój ból głowy, prawda? –

+1

@ crypto: masz na myśli błąd w 'findPos'? Nie, ten jest naprawdę, to jest twój kod, który robi coś złego. Bez samego kodu mogę się tylko domyślać, ale od nazywania funkcji przypuszczam, że to skanuje tablicę i przebiega poza przydzieloną granicę w jakiejś sprawie granicznej. Skompiluj z '-g' i valgrind powie Ci dokładną linię. –

+0

Ale ostateczna lokalizacja błędu jest określona jako klon.S, nad którym nie mam kontroli. –

18

To wydaje się oczywiste ... ale warto zauważyć, że komunikat "no leaks are possible" nie oznacza, że ​​Twój program nie może przeciekać; oznacza to po prostu, że nie wyciekł w konfiguracji, w której był testowany.

Jeśli uruchomię następujące z Valgrind bez parametrów wiersza polecenia, informuje mnie, że nie są możliwe wycieki. Ale przecieka, jeśli podam parametr wiersza poleceń.

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

+1 dobra uwaga! –

1

Sprawdzanie wycieków pamięci jest jednym z powodów do korzystania valgrind, ale powiedziałbym, że jest lepszy powód, aby znaleźć więcej poważnych błędów w kodzie, takie jak wykorzystanie nieprawidłowy indeks tablicy lub dereferencing niezainicjowanej wskaźnik lub wskaźnik do uwolnionej pamięci.

To dobrze, jeśli valgrind mówi ci, że ścieżki kodu, które wykonywałeś podczas używania valgrind, nie powodowały przecieków pamięci, ale nie pozwól, aby to spowodowało ignorowanie raportów o poważniejszych błędach, takich jak ten zobaczyć tutaj.

Jak sugerują inni, ponowne uruchomienie valgrind po kompilacji z informacjami debugowania (-g) byłoby dobrym następnym krokiem.

Powiązane problemy