• 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

  • 相关阅读:
    Git配置SSH访问GitHub
    vue 관련
    node
    关于CheckBox和EditText在ListView里多布局的处理
    百度地图定位
    java常用简单正则表达式写法
    Android二维码开源项目zxing编译
    Andrew XUtils的session获得和cookieStore使用
    常用易忘知识点
    替换Fragment 报错 The specified child already has a parent. You must call removeView()
  • 原文地址:https://www.cnblogs.com/tonny-li/p/4517896.html
Copyright © 2020-2023  润新知