本文共 3805 字,大约阅读时间需要 12 分钟。
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 在根目录下,编译某个模块转载地址:http://ejngi.baihongyu.com/