android内存分析工具集【0】 | 您所在的位置:网站首页 › adb抓手机日志 › android内存分析工具集【0】 |
我们对于Zygote fork出来的process,如APP以及system_server,都会进行Java运行环境分析。其关键是分析Java Heap,以便快速知道某个Java变量的值,以及Java对象的分布和引用情况。 通常Java Heap的分析方式则是抓取Java Hprof,然后使用MAT等工具进行分析。 * 抓取Hprof的手法,如: 第一种方式:使用am 命令(抓取Hprof的手法) adb shell am dumpheap {Process} file 如: adb shell chmod 777 /data/anr adb shell am dumpheap com.android.phone /data/anr/phone.hprof adb pull /data/anr/phone.hprof 下面这方法是抓取trace.txt日志文件中,在此处记录一下, 1.1 抓取的方式 * 在ENG Build 中 adb remount adb shell chmod 0777 data/anr adb shell kill -3 pid adb pull /data/anr * 在User Build 中 没有root 权限的情况下,只能直接pull 已经存在的backtrace. adb pull /data/anr * 你可以尝试直接使用下面的脚本一次性抓取 adb remount adb shell chmod 0777 data/anr adb shell ps @echo off set processid= set /p processid=Please Input process id: @echo on adb shell kill -3 %processid% @echo off ping -n 8 127.0.0.1>nul @echo on adb pull data/anr/traces.txt trace-%processid%.txt pause 第二种方式:使用DDMS 命令 在DDMS中选择对应的process,然后在Devices按钮栏中选择Dump Hprof file,保存即可 第三种方式:通过代码的方式 在android.os.Debug这个class 中有定义相关的抓取hprof 的method。 如: public static void dumpHprofData(String fileName) throwsIOException; 这样即可在代码中直接将这个process的hprof 保存到相对应的文件中,注意这个只能抓取当时的process。 如果想抓其他的process的hprof,那么就必须通过AMS帮忙了。 可以先获取IActivityManager接口,然后调用它的dumpheap方法。具体的代码,大家可以参考 frameworks/base/cmds/am/src/com/android/commands/am/am.java中的调用代码 第四种方式:发送SIGUSER1 在部分机器中,如果具有root权限,可以直接发送SIG 10来抓取,此时对应的Hprof保存在/data/misc下面,文件名如: heap-dump-tm1357153307-pid1882.hprof * 快速分析 首先, DVM的Hprof 和标准的Java Hprof 有一些差别,需要使用hprof-conv进行一次转换,将DVM格式的hprof 转换成标准的java 命令的hprof hprof-conv in.hprof out.hprof 其次,使用如MAT Tool,打开转换后的hprof文件,通常我们会 analysis java thread information analysis java var value analysis Object reference analysis GC path 具体如何使用MAT分析可以参考MAT 的官方网站。 |
CopyRight 2018-2019 实验室设备网 版权所有 |