Ich benutze Valgrind, um zu versuchen, einen Speicherverlust zu finden, ist der mysql C++ - Client von mysql verteilt.Verwenden von Valgrind, um ein Speicherleck im mysql C++ - Client zu finden
In den Beispielen (resultset.cpp) und meinem eigenen Programm gibt es einen einzelnen 56-Byte-Block, der nicht freigegeben ist. In meinem eigenen Programm habe ich das Leck zu einem Aufruf des mysql-Clients verfolgt.
Hier sind die Ergebnisse, wenn ich den Test ausführen:
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)
Ich habe ein paar Fragen in Bezug auf diese:
- Wie soll ich das --show-Block erreichbar interpretieren?
- Ist dieser Block nützlich für mich, um den Fehler auf Null zu setzen?
- Wenn der Block nicht nützlich ist, hat Valgrind einen anderen Mechanismus, der mir hilft, das Leck zu verfolgen?
- Wenn nicht, gibt es ein anderes Tool (hoffentlich OSS auf Linux), um mir dabei zu helfen, dies einzugrenzen?
Vielen Dank im Voraus ..
UPDATE: Hier ist der Code, den ich auf meinem System für die Definition von pthread_exit gefunden. Ich bin nicht sicher, dass dies die eigentliche Quelle ist, die aufgerufen wird. Aber wenn dem so ist, kann jemand erklären, was schief gehen könnte?
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 */
}
Danke Tim. Das hilft definitiv. Haben Sie Vorschläge, wie ich die Codezeile finden könnte, die den Speicher nicht explizit freigegeben hat? Kennen Sie irgendwelche Werkzeuge, die dabei hilfreich sein könnten? – Homer6
@ Homer6 Es ist eigentlich pthread macht es, nichts, was Sie beheben können (es sei denn, Sie wollen in 'pthread_exit()' ', suchen, finden Sie es, befreien Sie es explizit) .. aber dann behebt es nur auf Ihrem Rechner :) –
Danke Tim.Ich habe die Definition (oder was ich denke, ist die Definition) für pthread_exit gepostet. Irgendwelche Ideen, was passieren könnte? – Homer6