使用UMDH诊断Windows中的内存泄漏

时间:2015-10-24 17:17:30

标签: c++ c dll memory-leaks mariadb

作为预先要求:我对C ++ / C来说相当新。

我使用最近有重大内存泄漏的服务器端C ++应用程序。我能够在UMDH的帮助下诊断并随后修复内存泄漏。泄漏是在用C编写的主要DLL中的一个。在纠正之后,我开始审查UMDH报告的其他潜在泄漏。报告的下一个泄漏似乎来自Maria DB连接器库 - >要与SQL DB交互,我们使用LoadLibraryA加载Maria DB连接器库。一旦我们进入DLL,这就是其中一个调用堆栈:

libmariadb!_heap_alloc_base+0000005D (f:\dd\vctools\crt_bld\self_64_amd64\crt\src\malloc.c, 55)
libmariadb!_heap_alloc_dbg_impl+0000028D (f:\dd\vctools\crt_bld\self_64_amd64\crt\src\dbgheap.c, 431)
libmariadb!_nh_malloc_dbg_impl+00000039 (f:\dd\vctools\crt_bld\self_64_amd64\crt\src\dbgheap.c, 239)
libmariadb!_nh_malloc_dbg+00000049 (f:\dd\vctools\crt_bld\self_64_amd64\crt\src\dbgheap.c, 302)
libmariadb!malloc+0000002A (f:\dd\vctools\crt_bld\self_64_amd64\crt\src\dbgmalloc.c, 56)
libmariadb!my_malloc+0000009A (c:\mariadb-connector-c-2010\libmariadb\my_malloc.c, 36)
libmariadb!alloc_root+00000101 (c:\mariadb-connector-c-2010\libmariadb\my_alloc.c, 81)
libmariadb!mthd_stmt_read_all_rows+000000C9 (c:\mariadb-connector-c-2010\libmariadb\my_stmt.c, 181)
libmariadb!mysql_stmt_store_result+000003E6 (c:\mariadb-connector-c-2010\libmariadb\my_stmt.c, 1357)

我们传递一个指向DLL函数的指针,并最终将一个析构函数传回我们的一个C ++ DLL调用另一个DLL函数(mysql_stmt_free_result),以释放标识符所指向的内存。传入我上面提到的初始调用堆栈。在做了一些调试后,我确认析构函数正在调用DLL函数来执行清理并且成功。

我们正在动态链接Maria DB Connector DLL,所以这让我相信这个DLL所使用的堆与加载它的DLL正在使用的堆不同(请纠正我,如果这是错误的) 。如果这是真的,我想知道当UMDH使用堆管理器的工具来获取有关调用堆栈/未完成分配的信息时,这是否会导致问题?从我所读到的内容来看,似乎应该考虑与流程相关的所有堆。我希望有经验的人可以提供一些关于这个主题的见解。

编辑(决议):

经过进一步审核后,我不再相信这是误报,似乎代码没有取消分配语句句柄,您可以使用mysql_stmt_close来完成此操作。所以我的怀疑是不正确的,UMDH已经占了上风。

0 个答案:

没有答案