在应用程序退出之前关闭的共享库上使用Valgrind

问题描述 投票:0回答:2

如何在第三方应用程序中动态加载的共享库(.so)中找到内存泄漏,但代码不可用(但已使用调试信息构建)?问题可能是在退出应用程序之前共享库是dlclose'd并且Valgrind不再具有应用程序的调试信息并将内存泄漏的地址报告为问号。

目前已尝试过以下内容:

  1. 使用clang和gcc编译器构建带有调试信息的项目
  2. 在运行应用程序之前LD_PRELOAD共享库

有什么可以做的,以便Valgrind可以检测到调试符号吗?

c debugging memory-leaks valgrind
2个回答
1
投票

以下是valgrind 3.14 NEWS的摘录:

  • 新选项--keep-debuginfo = no | yes(默认为no)可用于保留卸载代码的调试信息。这允许保存的堆栈跟踪(例如,用于内存泄漏)包括已经dlclose'd(或类似)的代码的文件/行信息。有关更多信息和已知限制,请参阅用户手册。

因此,只需使用--keep-debuginfo = yes就可以显示泄漏的正确堆栈跟踪。


0
投票

在gcc上使用链接器的正确标志,强制共享库保持加载状态,直到应用程序退出。此选项称为:

-z nodelete

使用gcc构建示例标志:

gcc -fPIC -g -c -Wall -z nodelete

对于CMAKE:

set(CMAKE_SHARED_LINKER_FLAGS, "-z nodelete")

以上只用gcc测试过。

© www.soinside.com 2019 - 2024. All rights reserved.