Używam valgrind, aby spróbować i wyśledzić wyciek pamięci to klient mysql C++ rozprowadzany z mysql.Używanie valgrind do znalezienia wycieku pamięci w mysql klienta C++
W obu przykładach (wynikset.cpp) i mój własny program jest jeden 56-bajtowy blok, który nie został zwolniony. W moim własnym programie prześledziłem przeciek do wywołania do klienta mysql.
Oto wyniki po uruchomieniu testu:
valgrind --leak-check=full --show-reachable=yes ./my-executable
==29858== Memcheck, a memory error detector
==29858== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
==29858== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
==29858== Command: ./my-executable
==29858==
==29858==
==29858== HEAP SUMMARY:
==29858== in use at exit: 56 bytes in 1 blocks
==29858== total heap usage: 693 allocs, 692 frees, 308,667 bytes allocated
==29858==
==29858== 56 bytes in 1 blocks are still reachable in loss record 1 of 1
==29858== at 0x4C284A8: malloc (vg_replace_malloc.c:236)
==29858== by 0x400D334: _dl_map_object_deps (dl-deps.c:506)
==29858== by 0x4013652: dl_open_worker (dl-open.c:291)
==29858== by 0x400E9C5: _dl_catch_error (dl-error.c:178)
==29858== by 0x4012FF9: _dl_open (dl-open.c:583)
==29858== by 0x7077BCF: do_dlopen (dl-libc.c:86)
==29858== by 0x400E9C5: _dl_catch_error (dl-error.c:178)
==29858== by 0x7077D26: __libc_dlopen_mode (dl-libc.c:47)
==29858== by 0x72E5FEB: pthread_cancel_init (unwind-forcedunwind.c:53)
==29858== by 0x72E614B: _Unwind_ForcedUnwind (unwind-forcedunwind.c:126)
==29858== by 0x72E408F: __pthread_unwind (unwind.c:130)
==29858== by 0x72DDEB4: pthread_exit (pthreadP.h:265)
==29858==
==29858== LEAK SUMMARY:
==29858== definitely lost: 0 bytes in 0 blocks
==29858== indirectly lost: 0 bytes in 0 blocks
==29858== possibly lost: 0 bytes in 0 blocks
==29858== still reachable: 56 bytes in 1 blocks
==29858== suppressed: 0 bytes in 0 blocks
==29858==
==29858== For counts of detected and suppressed errors, rerun with: -v
==29858== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 8 from 6)
Mam kilka pytań odnośnie tego:
- W jaki sposób należy interpretować blok --show-osiągalny?
- Czy ten blok jest dla mnie przydatny, gdy próbuję zerwać błąd?
- Jeśli blok nie jest użyteczny, czy valgrind ma inny mechanizm, który pomoże mi prześledzić wyciek?
- Jeśli nie, czy jest jakieś inne narzędzie (mam nadzieję, że OSS na Linuksie), które pomoże mi to zawęzić?
góry dzięki ..
UPDATE: Oto kod, który znalazłem na moim systemie definicji pthread_exit. Nie jestem pewien, czy jest to faktyczne źródło, które jest wywoływane. Jeśli jednak tak jest, czy ktoś może wyjaśnić, co może być nie tak?
void
pthread_exit (void *retval)
{
/* specific to PTHREAD_TO_WINTHREAD */
ExitThread ((DWORD) ((size_t) retval)); /* thread becomes signalled so its death can be waited upon */
/*NOTREACHED*/
assert (0); return; /* void fnc; can't return an error code */
}
Dzięki Tim. To zdecydowanie pomaga. Czy masz jakieś sugestie, w jaki sposób mogę zlokalizować linię kodu, która nie uwolniła jawnie pamięci? Czy znasz jakieś narzędzia, które mogą być pomocne w tym? – Homer6
@ Homer6 To faktycznie pthread robi to, nic, co możesz naprawić (chyba, że chcesz zagłębić się w 'pthread_exit()', poszukaj go, znajdź, uwolnij to wyraźnie) .. ale wtedy to tylko naprawi to na twoim komputerze :) –
Dzięki Tim.Opublikowałem definicję (lub jak sądzę jest to definicja) dla pthread_exit. Jakieś pomysły na to, co może się wydarzyć? – Homer6