检测Android JNI代码中的本机内存泄漏

Vin*_*nay 6 java-native-interface android memory-leaks

如何检测Android JNI代码中的内存泄漏?我正在使用Froyo

fad*_*den 13

2017更新: valgrind适用于Android.内置的malloc调试功能在Android N中得到了显着扩展,对于查找内存泄漏非常有用.您可能需要_exit()应用程序才能触发转储.

下面描述的DDMS功能目前在官方文档中有简要提及.


有一个实验性的,不受支持的功能,您可以利用它.

在DDMS配置文件中(例如~/.android/ddms.cfg在Linux上),添加"native = true".这将启用"本机堆"选项卡.

接下来,在设备上启用本机堆分配跟踪,然后重新启动应用程序框架:

% adb shell setprop libc.debug.malloc 1 
% adb shell stop 
% adb shell start 
Run Code Online (Sandbox Code Playgroud)

(注意这需要root.请注意,这仅适用于最新版本;在旧版本中,您还需要手动将libc.so替换为设备上/ system/lib中的libc_debug.so.)

通过在发出简单命令("adb shell ls")时观察logcat输出,您可以判断是否已正确配置设备.如果你看到:

I/libc    ( 4847): ls using MALLOC_DEBUG = 1 (leak checker)
Run Code Online (Sandbox Code Playgroud)

然后你就知道你启用了它.

现在,您可以使用"本机堆"选项卡功能来获取堆内存使用情况的快照.

DDMS将自动从.../symbols/system/libAndroid源代码树中的共享库中提取符号.当然,这要求您拥有完整的Android源代码树,并且您的设备正在运行从中构建的代码.否则,堆栈跟踪无法解码为符号名称,这会降低功能的实用性.

  • 请定义"最新版本". (2认同)