Android调试方法

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]
adb shell monkey -p yourapp -v count

7 GDB
不用多说,可用来调试应用程序,还有个KGDB调试内核

8 strace
strace -i -v -p -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工具:https://www.360docs.net/doc/9314189652.html,/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 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 https://www.360docs.net/doc/9314189652.html, 当然要打开输入框,真的出来百度了。。。
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

在根目录下,编译某个模块




相关主题
相关文档
最新文档