我需要知道在共享库中找出内存泄漏的方法,该库将被加载到发行二进制文件中。我的意思是我使用-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: ???

请让我知道如何从共享库获取泄漏的堆栈跟踪信息?

最佳答案

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

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

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

如果您无法执行此操作,请尝试使用LD_PRELOAD保持库加载,如下所示:

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

希望这会欺骗动态链接器,使其即使在关闭库后也能保持加载状态。

10-06 08:18