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
在根目录下,编译某个模块
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
在根目录下,编译某个模块