现在的位置: 首页 > 综合 > 正文

Android调试方法

2017年10月04日 ⁄ 综合 ⁄ 共 4728字 ⁄ 字号 评论关闭

Android调试方法
 
 
1 dump虚拟内存
    cat /proc/xxxx/maps
    虚拟内存的位置可能有如下地方:
    -内核的defconfig文件
    -build/core/prelink-linux-arm.map
    -build/tools/apriori/prelinkmap.c
    -bionic/linker/Android.mk
    -bionic/linker/linker.h
 
2 Low memory killer
    Android系统应用程序会尽量使用系统内存,知道内存耗尽才开始清理后台程序
    各种情况的内存阈值可在init.rc中配置。
    被kill程序的优先级也可在init.rc中配置。
 
3 logcat
    不用多说
    logcat -d
    logcat -b envents
    查看内核信息
    cat /proc/kmsgs
 
4 Tiny Android
    是一个只有基本继续的小A系统,可以用于测试
 
5 CTS
    Google提出的标准测试,详细请Google
 
6 Monkey
    这个东西很好玩,向系统发送随机事件流,可以在手机上试试,会乱打电话上网下载。。。。。病毒啊!
    使用方法:
    adb shell monkey [option] <event-count>
    adb shell monkey -p yourapp -v count
 
7 GDB
    不用多说,可用来调试应用程序,还有个KGDB调试内核
 
8 strace
    strace -i -v -p <pid> -o /data/strace.txt
    android系统起来后一个好用的跟踪工具
 
9 ANR调试
    出现ANR会自动记录堆栈信息,可查看data目录的trace log
 
10 libc库
    libc库的调试可用含有debug信息的libc_debug库替换标准libc库
 
11, 查看当前堆栈
    在程序中加入代码,使可以在logcat中看到打印出的当前函数调用关系
    方法, new Exception(“print trace”).printStackTrace();
 
12. 打印debug信息
     $ adb bugreport
 
13. MethodTracing
     1) 功能:用于热点分析和性能优化,分析每个函数占用的CPU时间,调用次数,函数调用关系等 
 
         2) 方法:
 
         a) 在程序代码中加入追踪开关       
 
            1: import android.os.Debug;
 
            2: ……
 
            3: android.os.Debug.startMethodTracing(“/data/tmp/test”); // 先建/data/tmp目录
 
            4: …… // 被追踪的程序段
 
            5: android.os.Debug.stopMethodTracing();
 
         b) 编译,运行后,设备端生成/data/tmp/test.trace文件     
 
         c) 把trace文件复制到PC端
 
         $ adb pull /data/tmp/test.trace ./ 
 
         d) 使用android自带工具分析trace文件
 
         $ $ANDROID_SRC/out/host/linux-x86/bin/traceview test.trace
 
         此时可看到各个函数被调用的次数CPU占用率等信息 
 
         e) 使用android自带工具分析生成调用关系类图
 
         $ apt-get install graphviz # 安装图片相关软件
 
         $ANDROID_SRC/out/host/linux-x86/bin/dmtracedump -g test.png test.trace
 
         此时目录下生成类图test.png
 
 
 
         3) 注意
 
                   trace文件生成与libdvm模块DEBUG版本相冲突,所以此方法只适用于对非DEBUG版本模拟器的调试,否则在分析trace文件时会报错
 
 
 
14. HProf (Heap Profile)
 
 
 
         1) 功能:
 
         用于java层面的内存分析,显示详细的内存占用信息,指出可疑的内存泄漏对象
 
          
 
         2) 方法:
 
          
 
                   a) 在代码中加入dump动作
 
                    
 
                      1: import android.os.Debug;
 
                      2: import java.io.IOException;
 
                      3: ……
 
                      4: try {
 
                      5: android.os.Debug.dumpHprofData(“/data/tmp/input.hprof”); // 先建/data/tmp目录
 
                      6: } catch (IOException ioe) {
 
                      7: }
 
                   b) 把hprof文件复制到PC端
 
                   $ adb pull /data/tmp/input.hprof ./
 
                    
 
                   c) 使用命令hprof-conv把hprof转成MAT识别的标准的hprof
 
                   $ $ANDROID_SRC/out/host/linux-x86/bin/hprof-conv input.hprof output.hprof
 
                    
 
                   d) 使用MAT工具看hprof信息
 
                   下载MAT工具:http://www.eclipse.org/mat/downloads.php
 
                   用工具打开output.hprof
 
          
 
         3) 注意:此工具只能显示java层面的,而不能显示C层的内存占用信息
 
 
 
15. SamplingProfile (android 2.0上版本使用)
 
 
 
         1) 功能
 
         每隔N毫秒对当前正在运行的函数取样,并输出到log中
 
          
 
         2) 在代码中加入取样设定
 
          
 
            1: import dalvik.system.SamplingProfiler
 
            2: ……
 
            3: SamplingProfile sp = SamplingProfiler.getInstance();
 
            4: sp.start(n); // n为设定每秒采样次数
 
            5: sp.logSnapshot(sp.snapshot());
 
            6: ……
 
            7: sp.shutDown();
 
          
 
         它会启一个线程监测,在logcat中打印信息
 
 
 
16. 用发系统信号的方式取当前堆栈情况和内存信息
 
         1) 原理
                   dalvik虚拟机对SIGQUIT和SIGUSR1信号进行处理(dalvik/vm/SignalCatcher.c),分别完成取当前堆栈和取当前内存情况的功能
   
 
         2) 用法
 
                   a) $ chmod 777 /data/anr -R # 把anr目录权限设为可写
 
                   $ rm /data/anr/traces.txt # 删除之前的trace信息
 
                   $ ps # 找到进程号
 
                   $ kill -3 进程号 # 发送SIGQUIT信号给该进程,此时生成trace信息
 
                   $ cat /data/anr/traces.txt
 
                   功能实现:遍历thread list(dalvik/vm/Thread.c:dvmDumpAllThreadEx()),并打印当前函数调用关系(dalvik/vm/interp/Stack.c:dumpFrames())
 
                    
 
                   b) $ chmod 777 /data/misc -R
 
                   $ ps # 找到进程号
 
                   $ kill -10 进程号 # 发送SIGQUIT信事信号给该进程,此时生成hprof信息
 
                   $ ls /data/misc/*.hprof
 
                   此时生成hprf文件,如何使用此文件,见第二部分(HProf)
 
                   注意:hprof文件都很大,注意用完马上删除,以免占满存储器
 
 
最后是一些常用命令
1)service
 adb shell service list
 adb shell service check XXX
2)am命令可以启动apk, 如
    a, 设置
    am start -a android.settings.SETTINGS
    
    b, 设置中的辅助功能
    am start -a android.settings.ACCESSIBILITY_SETTINGS
    
    c, 设置中的无线和网络设置
    am start -a android.settings.WIRELESS_SETTINGS
    am start -a android.settings. AIRPLANE_MODE_SETTINGS
 
3)input命令,有时一个很好玩的命令!
功能:发送键盘信息
eg:adb shell input text www.baidu.com 当然要打开输入框,真的出来百度了。。。
adb shell input keyevent X  试试看保准有惊喜!
输入一串字母 input text "hello" 输入一个MENU按键 input keyevent 82
 
4) croot   
 
    在源代码的任何位置,当我们输入croot后,都可以直接跳转到源码的根目录上。
 
5) sgrep xxxxxx
 
   在源代码中查找xxxxxx,文件类型包括,*.c,*.java.*.h,*.cpp,*.xml,*.sh,*.mk
 
6) jgrep xxxx
 
   在源代码中查找XXXX 文件类型*.java
 
7) cgrep xxxx
 
  在源码中查找XXXX 文件类型*.c
 
8) mgrep xxxx
 
  在源码的Makefile 文件中查找XXXXX
 
9) 与编译有关的命令
 
    m
    
     全部编译
    
    mm
    
     进入某个单个模块,进行模块编译
    
    mmm
    
     在根目录下,编译某个模块

抱歉!评论已关闭.