`
tju_jusi
  • 浏览: 24223 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

使用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 下查看是否有这两个库 只包含在eng或者user-debug版的 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 shell

su

mount 

 

 

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

 

     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.so

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

 

 

  ⑦ 设置权限

 

 

chmod 0644 /system/lib/libc_malloc_debug_leak.so

chmod 0644 /system/lib/libc_malloc_debug_qemu.so 

 

 

3 配置

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

 ②命令行中执行

adb shell

su

setprop 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

 

 

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

 

stop
start

 

     如果命令成功,设备将在 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 的怎么变自己领悟吧。。。

 

  • 大小: 69.3 KB
分享到:
评论
1 楼 wv1124 2012-11-09  
注意,一定要是obj 底下的 .so , lib 里面的是不含有符号表的。另外 Method 中的地址一般要将高 3 位置 0 , 80cc6e22 变为 000c6e22 。 80dxxxxx 的怎么变自己领悟吧。。。


这个是为什么,一直没想明白,不过找到的地方有问题,不一定是出问题的方法

相关推荐

    android项目内存泄露排查实用.pdf

    Android项目内存泄露排查实用 本文主要讲述了 Android 项目...本文主要讲述了 Android 项目中内存泄露的排查和解决方法,包括使用 DDMS 和 MAT 工具来检测内存泄露,分析问题的根源,并采取相应的解决方法来解决问题。

    android项目内存泄露排查[收集].pdf

    1. **内存泄露的排查**:使用Logcat检查异常,使用DDMS的Update Heap视图监控内存,以及使用MAT等工具分析heap dump文件。 2. **Context的使用**:避免在Application或静态对象中保存Activity的Context,以免导致...

    android内存管理-MAT与防范手段

    1. 使用自身方法(Use Native Methods):对于计算密集型任务,可以考虑使用C/C++的Native方法,它们通常比Java更高效,但要注意管理好本地内存。 2. 使用虚拟优于使用接口:接口引用会使得对象无法被垃圾回收,...

    Android性能调优之内存分配信息1

    在Android系统中,还有其他类型的内存分配信息,如Native Heap、Graphics、Code等,每种类型都有其特点和用途。Native Heap是native代码使用的内存,Graphics是图形相关的内存,Code是代码相关的内存。 在实际开发...

    Android内存管理小结

    - **构造Adapter时未使用convertView**:在ListView或RecyclerView中使用Adapter时,重用convertView可以有效减少不必要的View创建,从而降低内存消耗。 - **Bitmap对象不再使用时调用recycle()**:Bitmap对象通常...

    详解Android内存泄漏检测与MAT使用

    在Android中,常见的内存泄漏场景包括: 1. 静态变量持有Activity的Context,这将导致Activity无法正常销毁。 2. Handler与Looper结合使用时,未处理的消息会保持对组件(如Activity)的引用,阻止其被回收。 3. 非...

    android内存管理-MAT与防范手段.pdf

    为了帮助开发者更好地理解应用内存的使用情况,并及时发现潜在的内存泄漏等问题,Android提供了一系列强大的内存管理工具。其中,DDMS(Dalvik Debug Monitor Service)作为一款综合性的调试工具,包含了多种用于...

    Android APK性能测试 procrank等工具

    4. ` profilertool`(Android Studio自带):针对Java和Native代码的CPU和内存分析工具。 5. `meminfo`:显示系统整体内存使用情况,包括缓存和总内存。 6. `电池分析`(Battery Historian):分析应用的电量消耗。 ...

Global site tag (gtag.js) - Google Analytics