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?
Odpowiedz
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.
http: // valgrind.org/docs/manual/manual-core.html # manual-core.suppress To jest łącze do informacji o pomijaniu błędów dla valgrind. – blwy10
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
.
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. –
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.
Jedyne czego brakuje w tej odpowiedzi, to co zrobić z tekstami tłumienia ... – lvella
Ustawienia te mają być zapisane w pliku tłumienia, który jest czytany po uruchomieniu Valgrind. Opcja --suppressions =
@mormegil przypadkowo przegłosował odpowiedź. Przepraszam – Greg
+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