检查Android本地代码的内存泄漏(Detecting memory leak in Android native code)

 

1 启动独立的ddms(不是从Eclipse启动),

在终端敲命令$ddms

如果提示ANDROID_SWT没有设置,可以在当前终端下敲:

export ANDROID_SWT=~/mydroid/out/host/linux-x86/framework

不过下次打开新终端需要重新设置,为了避免这样的麻烦,可以将这一句添加到 ~/.bashrc

把/system/lib/libc.so和/system/lib.libc_debug.so pull出来,备用,以便回滚,留意一下他们的大小,后面会用到。

 

 

2 想要将模拟器中的/system/lib/libc_debug.so做个拷贝,重命名为libc.so,覆盖原来的libc.so,

我试过这个办法,可是失败了:把libc_debug.so pull出来,重命名为libc.so,然后再push回去(/system是只读的,需要重新mount为可读可写,mount方法见步骤6),覆盖原来的libc.so,可是重启模拟器后,又自动复原了。

所以这个办法不可行,改用以下办法:

先替换out目录下的libc.so,再重新生成system.img,

通过搜索发现,libc.so和libc_debug.so在out/目录下有多个版本,obj/目录下的肯定不会用来打包,就看是用../symbols/system/lib下的还是../system/lib下的了,

通过和之前从模拟器上pull下来的libc.so,libc_debug.so的size作比较,可以确定用的是../system/lib下的(疑问:是不是这个版本没有符号表阿?那后面ddms怎么给出调试信息?)。

把libc.so删了(我们已经从模拟器pull了一个libc.so备份,所以不用再备份了),拷贝一个libc_debug.so,重命名为libc.so

重新打包system.img, $~/mydroid/out/host/linux-x86/bin/mkyaffs2image -f ~/mydroid/out/target/product/generic/system ~/mydroid/out/target/product/generic/system.img

 

 

3 在~/.android/ddms.cfg中加一句: native=true

.android是隐藏文件,如果看不到,在~目录下按Ctrl+H

 

 

4  为了在ddms中显示File和Line信息,还要设置两个环境变量

把/home/peipei/mydroid/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin加到PATH,让ddms找到arm-eabi-addr2line,

设置export ANDROID_PRODUCT_OUT=~/mydroid/out/target/product/generic,让ddms找到调试信息

 

5  重启模拟器和ddms,可以看到ddms的界面中多了一个Native Heap标签,切换到Native Heap标签,选择一个进程,点击Full Update,有个小窗口会不停的刷新闪动,耐心的等一会儿,好了,你看到所有信息了(包括File和Line,如果没有步骤4,你就看不到这两列),另外Log中可能搜索到MALLOC_DEBUG = 1 (leak checker)了,这也说明我们做对了。

 

 

6 顺便说一下,这个过程中,还学到了如何将/system这个默认只读的文件mount为可读可写(虽然往里面写的东西貌似会在重启模拟器后消失):

$adb shell

#mount    //查看已经挂载的目录信息

#mount -o remount,rw -t yaffs2 /dev/block/mtdblock0 /system  //最后两个参数参考上一步的信息

 

 

参考文献:

https://tor-proxy.net/proxy/express/browse.php?u=http%3A%2F%2Fwww.mail-archive.com%2Fandroid-porting%40googlegroups.com%2Fmsg06395.html&b=26

 

 

 

 

 

 

你可能感兴趣的:(检查Android本地代码的内存泄漏(Detecting memory leak in Android native code))