valgrind - 在共享库中查找内存泄漏

时间:2012-09-27 12:29:13

标签: memory-leaks shared-libraries valgrind

我需要知道如何找出共享库中的内存泄漏,该库将被加载到发布二进制文件中。我的意思是使用-g选项构建的共享库,但加载共享库的二进制文件不是使用-g选项构建的。

我得到的泄漏报告如下。

==739==    at 0x4A05809: malloc (vg_replace_malloc.c:149)
==739==    by 0x84781B1: ???
==739==    by 0x87507F5: ???
==739==    by 0x874CF47: ???
==739==    by 0x874E657: ???
==739==    by 0x874F7C2: ???
==739==    by 0x8779C0C: ???

请告诉我如何从共享库中获取泄漏的堆栈跟踪?

2 个答案:

答案 0 :(得分:8)

假设泄漏确实来自您的共享库,那么我认为问题不在于主可执行文件中缺少调试。

更有可能的问题是可执行文件在完成之前调用dlclose来卸载共享库。这意味着当valgrind来检查泄漏时,库的所有符号信息都会消失,因为库不再被加载。

如果您可以重建可执行文件,那么最简单的解决方案可能是暂时停止调用dlclose,以便库保持加载直到结束。

如果你不能这样做,那么尝试使用LD_PRELOAD来加载库,如下所示:

LD_PRELOAD="/path/to/library.so" valgrind my-executable

这将有助于动态链接器即使在它关闭后仍然保持库加载。

答案 1 :(得分:2)

正如之前的回答所示,这是因为您在程序终止之前关闭了库,因此valgrind无法使用符号信息。

使用LD_PRELOAD对我不起作用;我现在有两个版本;一个明确不调用dlclose();在这个版本中,valgrind正确地报告行号信息,就像您期望的动态链接一样。