如何检测 Android JNI 代码中的内存泄漏?我正在使用 Froyo
最佳答案
2017 年更新: valgrind is available对于安卓。内置的 malloc 调试功能在 Android N 中得到了显着扩展, 并且对于查找内存泄漏非常有用。您可能需要 _exit()
应用程序来触发转储。
下面描述的 DDMS 功能目前获得 brief mention在官方文档中。
您可以利用一项不受支持的实验性功能。
在您的 DDMS 配置文件中(例如 Linux 上的 ~/.android/ddms.cfg
),添加“native=true”。这会启用 Native Heap 选项卡。
接下来,在设备上启用 native 堆分配跟踪,并重启应用程序框架:
% adb shell setprop libc.debug.malloc 1
% adb shell stop
% adb shell start
(请注意,这需要 root。另请注意,这仅适用于最新版本;在旧版本上,您还需要在设备上的/system/lib 中手动将 libc.so 替换为 libc_debug.so。)
您可以通过在发出简单命令(“adb shell ls”)时观察 logcat 输出来判断您是否已正确配置设备。如果你看到:
I/libc ( 4847): ls using MALLOC_DEBUG = 1 (leak checker)
那么你就知道你已经启用了它。
现在您可以使用 Native Heap 选项卡功能来获取堆内存使用情况的快照。
DDMS 会自动从 Android 源代码树中的 .../symbols/system/lib
共享库中提取符号。当然,这需要您拥有完整的 Android 源代码树,并且您的设备正在运行从中构建的代码。否则,堆栈跟踪无法解码为符号名称,这会降低该功能的实用性。
关于android - 检测 Android JNI 代码中的 native 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3768463/