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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。