標籤:
主要介紹除了常規的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
Android下的一些調試手段(含kernel調試辦法)