当前位置: 代码迷 >> Android >> 运用DDMS中的native heap 检查Android native 内存泄露
  详细解决方案

运用DDMS中的native heap 检查Android native 内存泄露

热度:98   发布时间:2016-05-01 20:41:26.0
使用DDMS中的native heap 检查Android native 内存泄露

一、 手机端准备工作

1 安装库文件 ?

?

??? 所有的 ?native? 内存分配函数 ?( malloc ,? calloc ,?etc.)? 都在 ?Android libc ? 库中。为了跟踪堆内存的分配,需要使用这个库的特别版本,可以将每次内存开销记录下来。 ? 这些特殊版本的 ? libc ?(? libc_malloc_debug_leak.so ?and? libc_malloc_debug_qemu.so ?可以在手机中的/system/lib 下查看是否有这两个库 )? 只包含在英文或者用户调试版的 Android中。 如果手机是这两种系统之一,可以跳过下一步。

?

??? 下载最接近你手机模型和 Android系统版本( 2.3 4.0 等)的 CyanogenMod?ROM? 。如果没有恰好是你手机的对应版本,那么选择处理器相同的 ?( 比如 Tegra2)? Android系统版本(例如 2.3 )都相同的 rom. 。然后从 system/lib ? 文件夹 ? 抽出 libc_malloc_debug_leak.so ? libc_malloc_debug_qemu.so

?

?

????②以中兴 U880 手机为例,手机本身是移动定制的 Android2.2 系统, CyanogenMod? 官网上恰有中兴的 rom,但是系统版本为 2.3.7 ,并且手机需要 root 权限,所以使用 U880 刷机工具,刷U880_2.3.7?root rom

?

?

2 替换库

?

?

CM rom /system/lib 文件夹中抽出 ? libc_malloc_debug_leak.so ?和 libc_malloc_debug_qemu.so

?

?

libc_malloc_debug_leak.so ?和? libc_malloc_debug_qemu.so ?通过 USB拷到 ?SDCARD卡根目录下。

?

?

③手机中安 BusyBox ?以便使用 cp ?命令复制文件。

?

?

???? ??④PC端命令行中执行

?

adb shellsumount 

?

?

????不同手机返回的值不同,如下两例

?

???? LG?G2x:

???? ...

???? /dev/block/mmcblk0p1?/system?ext3?ro,noatime,errors=continue,data=ordered?0?0

? ?? ...

?

?

??? 中兴 U880 :

??? ...

??? /dev/block/ mtdblock11? /system? yaffs2? ro,relatime,barrier=1,data=ordered?0?0

??? ...

?

第一部手机将? /dev/block/mmcblk0p1 ?作为设备,? ext3 ?作为文件系统类型。

第二部手机将?/dev/block/ mtdblock11 ?作为设备, yaffs2? 作为文件系统类型。

?

?

????⑤使用上面得到的设备名,和文件系统类型,重新挂载系统分区为读写格式。如下所示:

??? LG?G2x:

mount -o remount,rw -t ext3 /dev/block/mmcblk0p1 /system

?

??? 中兴 U880 :

? ?

mount -o remount,rw -t  yaffs2  /dev/block/ mtdblock11  /system  

?

??⑥ 把两个库文件从S DCARD?拷到 /system/lib ?目录:?

?

cp /sdcard/libc_malloc_debug_leak.so /system/lib/libc_malloc_debug_leak.socp /sdcard/libc_malloc_debug_qemu.so /system/lib/libc_malloc_debug_qemu.so 

?

?

??⑦ 设置权限

?

?

chmod 0644 /system/lib/libc_malloc_debug_leak.sochmod 0644 /system/lib/libc_malloc_debug_qemu.so 

?

?

3 配置

???? 替换完新的库文件后,告知系统使用新的库分配内存。

?②命令行中执行

adb shellsusetprop libc.debug.malloc 1

?

??? 支持的参数:

?

?

1??-?perform?leak?detection

5??-?fill?allocated?memory?to?detect?overruns

10?-?fill?memory?and?add?sentinels?to?detect?overruns

20?-?use?special?instrumented?malloc/free?routines?for?the?emulator

?

?

???? 重启框架 ,命令行中继续执行

?

stopstart

? ?

???? 如果命令成功,设备将在 1 2 秒后重启, 注意并不是完全重启。?

?

????④ 检查配置

???? 输入:

??????

getprop

?

?

?

?? 将会得到很多信息,其中包括:

??? ...

??? [libc.debug.malloc]:?[1]

??? ...

?

??? 说明配置成功

?

?

二、PC设置

?

C:\Documents?and?Settings\Administrator\.android\ ddms.cfg 文件末尾添加

native=true

?

三、检查泄露

?

SDK\tools 中启动独立的 DDMS ddms.bat )可以看见 native?heap 选项卡

点击snapshot?current... 按钮就可以了,如果按下±按钮,在点击 snapshot?current? 可以比较两次之间新分配了哪些空间。

????有人说使用自己用源码编译出来DDMS 和模拟器,下面的 stacktrace 中的 File? 和? Line? 列就有值了。我们用的是真机啊。。。没有关系 ~~

????找到自己的库函数***.so? 后面的 Method 列中的地址。使用 NDK 中的 addr2line 工具,

用法:在命令行中addr2line.exe?-e??***\obj\local\armeabi\***.so? 地址

????注意,一定要是obj 底下的 .so lib 里面的是不含有符号表的。另外 Method 中的地址一般要将高 3 位置 0 80cc6e22 变为 000c6e22 80dxxxxx 的怎么变自己领悟吧。。。

?

  相关解决方案