Android下的一些调试手段(含kernel调试办法)
主要介绍除了常规的kernel的printk和android的DDMS, logcat外的几个调试手段.
包括bugreport, oprofile, traceview, ftrace等.
Bugreport
Bugreport是android平台自带的工具, 收集了device端的详细的状况, 可以在console下直接运行“bugreport > /sdcard/bugreport.log”或者接入USB cable并打开adb debug的状况下运行”adb bugreport > bugreport.log”.
下面是一个抓取的bugreport的参考资料.
相关代码路径
frameworksasecmdsugreport
frameworksasecmdsdumpstate
frameworksasecmdsdumpsys
oprofile
Oprofie的原理比较简单: 很多CPU都提供一个所谓性能计数器的东西(performance counter),
大致的原理就是程序可以注册告诉CPU对什么event感兴趣(比如CPU_CYCLE, CPU经历了一次时钟周期),
然后CPU在执行了相应的操作后, 就会在性能计数器上加1, 这样程序就可以取出.
所以, 使用OProfile来定位CPU使用率的问题, 就变成了让oprofile收集程序运行过程中哪个可执行程序(或是so)中的哪个function, 消耗的CPU CYCLE最多.
在实际应用中, oprofile可以用来对找出系统的瓶颈并进行优化.
R70中默认的工程中, Oprofile是没有被编译进来的, 需要修改externaloprofileopcontrolandroid.mk和externaloprofiledaemonandroid.mk
两个文件中的LOCAL_MODULE_TAGS 属性从debug修改为eng或者user, 从而将oprofile编译进android中.
此外, Oprofile需要kernel中打开相应的compile option来支持, kernel对应代码在kernel race目录中. 相应的config如下:
General setup [*] Profiling Support
CONFIG_PROFILING
General setup <*> OProfile system profiling
CONFIG_OPROFILE
CONFIG_RING_BUFFER
CONFIG_RING_BUFFER_ALLOW_SWAP
CONFIG_RING_BUFFER_BENCHMARK is not set
General setup Kernel Performance Events And Counters
[*] Kernel performance events and counters
CONFIG_PERF_EVENTS
CONFIG_HW_PERF_EVENTS
Examples:
最后, 在PC端安装oprofile以便对device端生成的结果进行解析.
如果需要得到最后的图形结果, 还需要安装Graphviz.
所有的准备工作就绪后,只要在device端运行如下的命令,即可启动oprofile对device进行检测.
opcontrol–quick ===> setup相应的环境和参数
opcontrol–start ===> 启动oprofile
opcontrol–status ===> 中途可以查看oprofile的状态
opcontrol–stop ===> 停止oprofile
opcontrol–dump ===> 将结果保存至/data/oprofile 路径
最后, 在PC端运行android工程中的externaloprofile下的opimport_pull脚本, 即可生成相应的结果callgraph.txt, load.txt, load2.txt以及callgraph.png(如下).
注意, 在运行脚本前需要设置一些环境变量和device端kernel对应的vmlinux档案.
exportOPROFILE_EVENTS_DIR= {Your Android Source DIR}/prebuilt/linux-x86_64/oprofile/
exportOPROFILE_BIN_DIR=/{Oprofile Bin DIR on Your PC }/
exportOUT= {Your Android Source DIR}/out/target/product/smdkv210
cd {Your Android Source DIR}/out/target/product/smdkv210/symbols
ln -s {Your Kernel Source DIR}/vmlinux ./vmlinux
traceview
Traceview是android自带的tool,用来分析在android端通过调用Debug.startMethodTracing(xxxx);生成的名为xxxx.trace的档案. 这个方法需要在android的代码中添加Debug.startMethodTracing(xxxx)和Debug.stopMethodTracing()的代码. 使用者通过在合理地点添加这两个函数, 可以很直观的分析在这个中间过程中, 系统的运行状况, 上到每个进程在什么时候开始跑了多长时间, 下到每个函数跑了多少次, 每次跑了多长时间.
Ftrace
ftrace是内建于Linux内核的跟踪工具, 从2.6.27开始加入主流内核. ftrace的作用是帮助开发人员了解 Linux 内核的运行时行为, 以便进行故障调试或性能分析.
使用ftrace可以对内核函数调用、上下文切换进行跟踪, 还可以查看中断被关闭的时长, 跟踪内核态中的延迟以及性能问题等.
使用ftrace对内核进行跟踪调试, 可以找到内核中出现的问题的根源, 通过ftrace来观察内核中发生的活动, 则可以了解内核的工作机制.
Ftrace可以在device的UI没有反应, 但是console还是active的状况下对kernel进行分析.
Ftrace的功能需要在kernel中打开相应的config. 此外, 打开ftrace会给系统带来额外的overhead, 因此应该在release的版本中尽可能关闭ftrace的功能.
图 1.Kernel hackin
图 1. Kernel hacking
图 2. Tracers
图 3. 内核支持的跟踪器列表
R70的kernel中,Ftrace支持的tracer有 wakeup, preemptirqsoff, preemptoff, irqsoff, function, sched_switch共6种.
具体的使用方法可以参考Reference中的连接以及kernel中的documents race下的ftrace.txt
得到的一些结果如下:
http://www.2cto.com/kf/201501/366871.html