如何在第三方应用程序中动态加载的共享库(.so)中找到内存泄漏,但代码不可用(但已使用调试信息构建)?问题可能是在退出应用程序之前共享库是dlclose'd并且Valgrind不再具有应用程序的调试信息并将内存泄漏的地址报告为问号。
目前已尝试过以下内容:
有什么可以做的,以便Valgrind可以检测到调试符号吗?
以下是valgrind 3.14 NEWS的摘录:
- 新选项--keep-debuginfo = no | yes(默认为no)可用于保留卸载代码的调试信息。这允许保存的堆栈跟踪(例如,用于内存泄漏)包括已经dlclose'd(或类似)的代码的文件/行信息。有关更多信息和已知限制,请参阅用户手册。
因此,只需使用--keep-debuginfo = yes就可以显示泄漏的正确堆栈跟踪。
在gcc上使用链接器的正确标志,强制共享库保持加载状态,直到应用程序退出。此选项称为:
-z nodelete
使用gcc构建示例标志:
gcc -fPIC -g -c -Wall -z nodelete
对于CMAKE:
set(CMAKE_SHARED_LINKER_FLAGS, "-z nodelete")
以上只用gcc测试过。