2012-06-28 19 views
15

biegnę Valgrind z następującymi parametrami:Jak uzyskać pełny stos wywołań z Valgrind?

--leak-check=full --show-reachable=yes --leak-resolution=high --num-callers=100 --trace-children=yes 

W wycieków pamięci zalogować, widzę jakieś komunikaty o błędach z pełnym stosem prześledzić aż do main, ale niektóre komunikaty wyglądają jak następuje:

==3956== 1,999,140 (68,796 direct, 1,930,344 indirect) bytes in 5,733 blocks are definitely lost in loss record 8,842 of 8,845 
==3956== at 0x4022AB8: malloc (vg_replace_malloc.c:207) 
==3956== 

Jak czy mogę uzyskać pełne śledzenie stosu tych błędów?

+0

Ostatnia dostępna wersja Valgrind obsługuje tylko -num-callers do 50. Nie jest więc jasne, której wersji używasz. Powyższy ślad stosu wygląda na niekompletny. Może to być związane ze sposobem kompilacji aplikacji (np. Opcja -fomit-frame-pointer może utrudnić tworzenie śladu stosu) – phd

+0

Bump. (robi stackoverflow "bump" posty?) Ten sam problem. Kompilowanie aplikacji za pomocą -g. Pokazuje możliwe wycieki pamięci ze śledzeniem stosu z malloc(), funkcją o nazwie malloc(), a następnie main(), pomijając wszystko pomiędzy, włączając funkcje w tym samym pliku co main(). ?? Widzę przykłady online, które nie mają tego limitu 3 klatek na stosie ... ?? Jakieś pomysły? – Samuel

+0

Używam valgrind 3.8.1 na Ubuntu 13.10 i zobacz śledzenie stosu, które nie zawiera wszystkich wywołań pośrednich. Brak optymalizacji podczas kompilacji za pomocą gcc (lub może potrzebuję -Og lub coś takiego ...) – thoni56

Odpowiedz

14

Uzyskanie pełnego śledzenia stosu będzie wymagało symboli debugowania dla wszystkich bibliotek/plików wykonywalnych, które mogą być zaangażowane w wyciek (oraz w granicach określonych przez --num-callers).

Jeśli tworzysz dowolne z nich samodzielnie, musisz podać flagę -g w gcc (lub odpowiednią flagę w dowolnym innym kompilatorze).

Należy pamiętać, że nie jest niezawodny i może czasami tracić szczelność lub nie może dostarczyć pełnych śladów stosu (szczególnie jeśli używasz wątków lub skomplikowanych implementacji class).

Dla bibliotek bez informacji debugowania śledzenie stosu zatrzyma się w tej bibliotece.

Aby uzyskać bezpłatne narzędzie, jest bardzo dobre w tym, co robi, ale jest powód, że miejsca takie jak IBM mogą sprzedawać profile pamięci za duże pieniądze.

+6

Dzięki, w moim przypadku po prostu musiałem dostosować opcję --num-callers. Domyślna wartość to 12, co jest dość niskie dla STL i tym podobne. – cib

Powiązane problemy