2012-06-12 20 views
6

otrzymam ostateczną „Gotowe” wiadomość z valgrind, a otrzymasz ten raport Wyjście:Segfaulting tylko bez 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) 

Ale kiedy go uruchomić bez valgrind, zwraca błąd natychmiast. Czy valgrind tłumi pewien rodzaj błędu, którego powinienem szukać? Nie mogę znaleźć żadnych informacji na ten temat w Internecie

+1

Czy "nieprawidłowy odczyt" lub "nieprawidłowy zapis" w danych wyjściowych valgrind? –

+0

ton z nich. Te muszą być złe. – SetSlapShot

+2

Tak. To znaczy, że czytasz lub piszesz pamięć, która nie należy do ciebie. Naprawię je wszystkie. –

Odpowiedz

4

Valgrind uruchamia program w innym środowisku niż w przypadku uruchamiania z powłoki. Może to zapobiec pewnym awariom w przypadku wyczerpania pamięci lub wychodzenia z tablicy.

Popraw 140 kontekstów błędów, a wszystko będzie w porządku.

3

Memcheck nie wykonuje pełnego sprawdzenia granic i ponieważ ma własny alokator pamięci, może tłumić błędy, które w przeciwnym razie dostałbyś. Zamiast tego użyj debuggera.

1

Jednym z przykładów błędu, który czasami nie jest przechwytywany przez Valgrind, jest zwolnienie pamięci, a następnie odniesienie jej przez inny wskaźnik, który również wskazywał to samo miejsce.

Nie jestem pewien, dlaczego tak się dzieje. Być może środowisko Valgrind w różny sposób obsługuje alokację i alokację pamięci. [Tak jak mówi Eregrith]

Szybkim sposobem sprawdzenia tego byłoby tymczasowe skomentowanie twoich bezpłatnych wywołań funkcji() i sprawdzenie, czy nadal jest to uszkodzenie. [Odkomentuj je później, gdy je naprawisz!]