如何使用Valgrind跟踪动态加载的库?

时间:2016-07-06 07:32:41

标签: shared-libraries valgrind

我有一个使用dlopendlclose来加载/卸载库的进程。该库有一些内存泄漏,我想用Valgrind跟踪。我尝试了以下方法:

LD_PRELOAD=libmylibrary.so valgrind --leak-check=full myprogram

它不起作用。我得到一个未定义的符号错误,因为库依赖于主程序中的一些符号。有没有其他方法可以让程序库在程序结束时保持加载状态?

2 个答案:

答案 0 :(得分:1)

这是一个古老的问题,但是我相信,如果某人偶然发现这个问题,它将在将来对您有所帮助。

您可以将--keep-debuginfo=yes参数传递给valgrind:

-keep-debuginfo = <是|否> [默认:否]

启用后,保留(“归档”)符号和所有其他debuginfo以便卸载代码。这个 允许保存的堆栈跟踪信息包含已dlclose'd的代码的文件/行信息(或 类似)。请注意这一点,因为它可能导致程序无限制地使用内存, 反复加载和卸载共享对象。

某些工具和某些功能仅对归档的调试信息提供有限的支持。 Memcheck完全支持它。通常,报告错误的工具可以使用存档的调试信息来 显示错误堆栈跟踪。已知的限制是:Helgrind过去的访问堆栈跟踪 竞争条件是不使用存档的调试信息。断层块(通常是xtree断层块 输出格式)不使用存档的调试信息。仅Memcheck经过(某种程度上)测试 --keep-debuginfo = yes,因此其他工具可能有未​​知的限制。

答案 1 :(得分:0)

跳过测试程序中的dlclose(),以便共享对象的代码段保存在进程的内存映射表中。然后当valgrind找到由此共享对象引起的任何泄漏时,它可以从进程的内存映射表中找到符号名称。

如果调用dlclose(),dl库可能会从进程的内存空间中卸载共享对象,那么valgrind将无法将地址解析为有意义的符号名称。

此外,使用LD_PRELOAD =加载带有调试信息的库。