使用valgrind在mysql c ++客户端中查找内存泄漏

我正在使用valgrind来尝试跟踪内存泄漏是从MySQL分发的mysql c ++客户端。

在这两个例子(resultset.cpp)和我自己的程序中,都有一个56字节的块没有被释放。 在我自己的程序中,我已经追踪到泄漏到一个调用mysql客户端。

运行testing时,结果如下:

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) 

我有几个关于这个问题的问题:

  1. 我应该怎样解释–show-reachable块?
  2. 那个块对我来说是有用的吗?
  3. 如果该块没有用,valgrind是否有另一种机制可以帮助我追踪泄漏?
  4. 如果没有,有没有其他的工具(希望Linux上的OSS)来帮助我缩小这个范围?

提前致谢..

更新:这是我在我的系统上为pthread_exit的定义find的代码。 我不确定这是被调用的实际源。 但是,如果是的话,谁能解释一下可能会出现什么问题?

 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 */ } 

可达是指在程序退出时,程序块有一个有效的指针指向它们,这表明程序不会在退出时显式释放所有的东西,因为它依赖于底层的操作系统。 你应该找的是丢失的块,其中的内存块失去了所有的引用,不能再被释放。

所以,56字节可能被分配在主,这并没有明确释放他们。 您发布的内容不会显示内存泄漏。 它显示了主要释放所有东西,但主要分配的东西,因为主要假定它死的时候,所有的内存将被内核回收。

具体来说,这是一个假设(这是一个有效的假设,在过去15年以上的写作生产中找到的一切都是假的)。 需要释放在退出时仍然有一个有效引用的块是有点争议的一点,但是对于这个具体的问题,所有需要提到的是假设。

编辑

实际上, pthread_exit()没有在退出时清除某些东西,但是正如所解释的那样,一旦达到那一点,它可能不需要(或者很可能不会 )。