android - 检测 Android JNI 代码中的 native 内存泄漏

标签 android memory-leaks java-native-interface

如何检测 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/

相关文章:

java-native-interface - Java native 代码字符串结尾

java - Solaris 9 : memory leak detection

android - unity google play 应用程序签名问题和 keystore

c++ - 私有(private)脏内存可以指示内存泄漏吗?

javascript - 我的对象是否被覆盖并处置

c++ - malloc 失败条件

java - 如何使用 JNI 将 C ODBC 连接公开到 JVM?

android - 即使一个或多个操作抛出异常,如何继续多个 Kotlin 协程异步操作?

android - 从其他类显示 PopUpWindow - Android

android - EJNI致命异常 : Method not found