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