2010-07-04 13 views
40

A najlepiej wszystkie z nich zamiast tylko mojego kodu? Mój program używa Gtk, Loudmouth i kilku innych rzeczy, a te dwa (i niektóre z nich, libgcrypto, libssl) powodują tyle błędów, że nie jestem w stanie wykryć mojego. Czy jest możliwe, aby valgrind ignorował rzeczy pochodzące z głębszych niż mój własny kod?Czy jest możliwe, aby valgrind ignorował pewne biblioteki?

+1

+1, Mam takie same problemy. Biblioteka GL firmy NVIDIA wykonuje skoki warunkowe na podstawie niezainicjowanej pamięci, a 'std :: string' nadal generuje fałszywe alarmy (" prawdopodobnie utracone "). – Thomas

Odpowiedz

12

Można generować tłumienia błędów dla bibliotek, ale nie sądzę, że można ogólnie wyłączyć biblioteki.

Trudno również automatycznie stwierdzić, czy błąd pamięci w bibliotece jest spowodowany przez problem z kodem, czy też nie.

+4

http: // valgrind.org/docs/manual/manual-core.html # manual-core.suppress To jest łącze do informacji o pomijaniu błędów dla valgrind. – blwy10

5

Szczególnie w przypadku OpenSSL jest to bardzo trudne. Klucze szyfrowania SSL są częściowo oparte na niezainicjalizowanym koszcie stosu, co oznacza, że ​​wszystkie odszyfrowane dane są również skażone. Zanieczyszczenia te rozprzestrzeniają się poza samą OpenSSL.

Kompilowanie OpenSSL z opcją "PURIFY" może pomóc tutaj. Niestety, z powodu słabo przemyślanych działań głównych dystrybucji Linuksa jest mało prawdopodobne, aby stał się domyślny.

Bardzo tępym rozwiązaniem jest opcja memcheck's --undef-value-errors=no.

+1

Nice. Ignorowanie wartości niepoprawnych faktycznie spowodowało, że mój szczególny przypadek, w którym miałem "Ponad 10000000 wykrytych błędów całkowitych" pochodzących z biblioteki (nie OpenSSL), przeanalizowałem resztę kodu. –

28

Zakładając używasz memcheck narzędzie i chcesz ignorować Leak błędy w libcrypto tylko, można umieścić tłumienie jak:

{ 
    ignore_libcrypto_conditional_jump_errors 
    Memcheck:Leak 
    ... 
    obj:*/libcrypto.so.* 
} 

... do pliku i przekazać to do valgrind z --suppressions=*FILENAME*.

Aby zignorować Leak błędy w wszystkie biblioteki współdzielone pod każdym lib katalogu (/lib, /lib64, /usr/lib, /usr/lib64 ...):

{ 
    ignore_unversioned_libs 
    Memcheck:Leak 
    ... 
    obj:*/lib*/lib*.so 
} 
{ 
    ignore_versioned_libs 
    Memcheck:Leak 
    ... 
    obj:*/lib*/lib*.so.* 
} 

jest mało prawdopodobne, ale może trzeba dodać dodatkowe odmiany wzoru katalogu do odpowiedzialności za rozmieszczenie i X11 Biblioteki GTK.

Pamiętaj, że to zignoruje błędy spowodowane przez wszelkie wywołania zwrotne, które zostały napisane przez biblioteki. Catching błędy w tych wywołań zwrotnych mogłoby prawie być wykonane z:

{ 
    ignore_unversioned_libs 
    Memcheck:Leak 
    obj:*/lib*/lib*.so 
    ... 
    obj:*/lib*/lib*.so 
} 
{ 
    ignore_versioned_libs 
    Memcheck:Leak 
    obj:*/lib*/lib*.so.* 
    ... 
    obj:*/lib*/lib*.so.* 
} 

... ale ten ujawnia błędy w połączeniach przez biblioteki, które korzystają z malloc Valgrind. Ponieważ valgrind malloc jest wstrzykiwany bezpośrednio do tekstu programu - nie załadowany jako biblioteka dynamiczna - pojawia się w stosie w taki sam sposób, jak robi to twój własny kod. Pozwala to Valgrind śledzić alokacje, ale także utrudnia wykonanie dokładnie tego, o co prosiłeś.

FYI: Używam valgrind 3.5.

+7

Jedyne czego brakuje w tej odpowiedzi, to co zrobić z tekstami tłumienia ... – lvella

+7

Ustawienia te mają być zapisane w pliku tłumienia, który jest czytany po uruchomieniu Valgrind. Opcja --suppressions = Zobacz http://valgrind.org/docs/manual/manual-core.html –

+0

@mormegil przypadkowo przegłosował odpowiedź. Przepraszam – Greg

Powiązane problemy