qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請訪問 http://qaseven.github.io/

          Android軟件測試的日志文件抓取簡介

          1、log文件分類簡介
            實時打印 的主要有: logcat main , logcat radio , logcat events , tcpdump ,還有高通平臺的還會有QXDM 日志
            狀態(tài)信息 的有: adb shell cat /proc/kmsg , adb shell dmesg , adb shell dumpstate , adb shell dumpsys , adb bugreport ,工程模式等
            2、LOG抓取詳解
            l  實時打印
            adb logcat -b main -v time>app.log  打印應(yīng)用程序的 log
            adb logcat -b radio -v time> radio.log 打印射頻相關(guān)的 log , SIM STK 也會在里面, modem 相關(guān)的ATcommand 等,當然跟 QXDM 差的很遠了。
            adb logcat -b events -v time  打印系統(tǒng)事件的日志,比如觸屏事件。。。
            tcpdump 是很有用的,對于 TCP/IP 協(xié)議相關(guān)的都可以使用這個來抓, adb shell tcpdump -s 10000 -w /sdcard/capture.pcap ,比如抓 mms 下載的時候的 UA profile , browser 上網(wǎng)的時候,使用 proxy 的 APN 下載, streaming 的相關(guān)內(nèi)容包括 UA profile 等。
            最后是高通平臺的 QXDM ,不管是不是 Android ,只要使用高通芯片,都會對它很熟悉,當然了,不是高通的芯片就不用提它了。這個不多講,內(nèi)容豐富,射頻,電話,上網(wǎng), ... 凡是高通提供的解決方案,這個都可以抓。(QXDM 的 LOG抓取方法請參考 QPST、 QXDM的基本使用說明及作用 )
            l  狀態(tài)信息
            o   bugreport (命令 adb bugreport>bugreport.log) 。里面包含有 dmesg , dumpstate 和 dumpsys 。
            o   dumpstate 是系統(tǒng)狀態(tài)信息,里面比較全,包括手機當前的內(nèi)存信息、 cpu 信息、 logcat 緩存, kernel 緩存等等。
            o     adb shell dumpsys 這個是關(guān)于系統(tǒng) service 的內(nèi)容都在這個里面,這個命令還有更詳盡的用法,比如 adb shell dumpsys meminfo system 是查看 system 這個 process 的內(nèi)存信息。
            o   kmsg 抓取
            adb shell cat /proc/kmsg > kmsg.txt ,打開后查 msm_kgsl 字段
            說明:用于檢索用 printk 生成的內(nèi)核消息。任何時刻只能有一個具有超級用戶權(quán)限的進程可以讀取這個文件。也可以用系統(tǒng)調(diào)用 syslog 檢索這些消息。通常使用工具 dmesg 或守護進程 klogd 檢索這些消息。 proc 是一個內(nèi)存文件系統(tǒng) , 每次讀文件 kmsg 實際是內(nèi)核內(nèi)部的循環(huán)緩沖區(qū) , 每讀過后 , 循環(huán)緩沖區(qū)的東西就被認為已經(jīng)處理過了 ( 也就是變成無效內(nèi)容 ), 所以你再次讀為空是很正常的 為什么會這樣處理呢 , 循環(huán)緩沖區(qū)大小有限 , 內(nèi)核又隨時可能往里面寫東西 , 所以這樣處理很正常 . 你去查一下 /proc/kmsg 的信息有沒有跟系統(tǒng)日志關(guān)聯(lián) , 如果有的話 ,你就可以讀日志文件
            o   dmsg 抓取
            adb shell dmesg > dmesg.txt
            說明: dmesg 用來顯示開機信息, kernel 會將開機信息存儲在 ring buffer 中。您若是開機時來不及查看信息,可利用 dmesg 來查看。 dmesg 是 kernel 的 log ,凡是跟 kernel 相關(guān)的,比如 driver 出了問題(相機,藍牙, usb ,啟動,等等)開機信息亦保存在 /var/log 目錄中,名稱為 dmesg 的文件里。 more /var/log/dmesg
            o   工程模式下 log 的抓取
            對于 Apollo 手機請撥打 *#*#8888#*#* , 然后勾選相應(yīng)的 LOG 。待測試結(jié)束后,通過 SD 卡導(dǎo)出 LOG 到PC.
            3、Log分析:
            Get Log from Android System
            adb bugreport > bugreport.txt
            copy bugreport to the current directory.
            bugreport 里面包含了各種 log 信息 , 大部分 log 也可以通過直接運行相關(guān)的程序來直接獲得 .
            步驟如下 :
            1.adb shell 2. 進入相關(guān)工具程式的目錄 3. 執(zhí)行相關(guān)程式 4. 得到相關(guān)信息
            下面以輸出進程信息為例 1.adb shell 2. 輸入 ps -P 3. 可以看到相關(guān)進程信息
            Log Archive Analysis
            1.bugreport
            bugreport 記錄 android 啟動過程的 log, 以及啟動后的系統(tǒng)狀態(tài) , 包括進程列表,內(nèi)存信息, VM 信息等等到.

           2.bugreport 結(jié)構(gòu)分析
            (1)dumpstate
            MEMORY INFO
            獲取該 log: 讀取文件 /proc/meminfo
            系統(tǒng)內(nèi)存使用狀態(tài)
            CPU INFO
            獲取該 log: 執(zhí)行 /system/bin/top -n 1 -d 1 -m 30 -t
            系統(tǒng) CPU 使用狀態(tài)
            PROCRANK
            獲取該 log: 執(zhí)行 /system/bin/procrank
            執(zhí)行 /system/xbin/procrank 后輸出的結(jié)果 , 查看一些內(nèi)存使用狀態(tài)
            VIRTUAL MEMORY STATS
            獲取該 log: 讀取文件 /proc/vmstat
            虛擬內(nèi)存分配情況
            vmalloc 申請的內(nèi)存則位于 vmalloc_start ~ vmalloc_end 之間,與物理地址沒有簡單的轉(zhuǎn)換關(guān)系,雖然在邏輯上它們也是連續(xù)的,但是在物理上它們不要求連續(xù)。
            VMALLOC INFO
            獲取該 log: 讀取文件 /proc/vmallocinfo
            虛擬內(nèi)存分配情況
            SLAB INFO
            獲取該 log: 讀取文件 /proc/slabinfo
            SLAB 是一種內(nèi)存分配器 . 這里輸出該分配器的一些信息
            ZONEINFO
            獲取該 log: 讀取文件 /proc/zoneinfo
            zone info
            SYSTEM LOG( 需要著重分析 )
            獲取該 log: 執(zhí)行 /system/bin/logcat -v time -d *:v
            會輸出在程序中輸出的 Log, 用于分析系統(tǒng)的當前狀態(tài)
            VM TRACES
            獲取該 log: 讀取文件 /data/anr/traces.txt
            因為每個程序都是在各自的 VM 中運行的 , 這個 Log 是現(xiàn)實各自 VM 的一些 traces
            EVENT LOG TAGS
            獲取該 log: 讀取文件 /etc/event-log-tags
            EVENT LOG
            獲取該 log: 執(zhí)行 /system/bin/logcat -b events -v time -d *:v
            輸出一些 Event 的 log
            RADIO LOG
            獲取該 log: 執(zhí)行 /system/bin/logcat -b radio -v time -d *:v
            顯示一些無線設(shè)備的鏈接狀態(tài) , 如 GSM , PHONE,STK(Satellite Tool Kit)…
            NETWORK STATE
            獲取該 log: 執(zhí)行 /system/bin/netcfg ( 得到網(wǎng)絡(luò)鏈接狀態(tài) )
            獲取該 log: 讀取文件 /proc/net/route ( 得到路由狀態(tài) )
            顯示網(wǎng)絡(luò)鏈接和路由
            SYSTEM PROPERTIES
            獲取該 log: 參考代碼實現(xiàn)
            顯示一些系統(tǒng)屬性 , 如 Version,Services,network…
            KERNEL LOG
            獲取該 log: 執(zhí)行 /system/bin/dmesg
            顯示 Android 內(nèi)核輸出的 Log
            KERNEL WAKELOCKS
            獲取該 log: 讀取文件 /proc/wakelocks
            內(nèi)核對一些程式和服務(wù)喚醒和休眠的一些記錄
            KERNEL CPUFREQ
            (Linux kernel CPUfreq subsystem) Clock scaling allows you to change the clock speed of the CPUs on the fly.
            This is a nice method to save battery power, because the lower the clock speed is, the less power the CPU consumes.
            PROCESSES
            獲取該 log: 執(zhí)行 ps -P
            顯示當前進程
            PROCESSES AND THREADS
            獲取該 log: 執(zhí)行 ps -t -p -P
            顯示當前進程和線程
            LIBRANK
            獲取該 log: 執(zhí)行 /system/xbin/librank
            剔除不必要的 library
            BINDER FAILED TRANSACTION LOG
            獲取該 log: 讀取文件 /proc/binder/failed_transaction_log
            BINDER TRANSACTION LOG
            獲取該 log: 讀取文件 /proc/binder/transaction_log
            BINDER TRANSACTIONS
            獲取該 log: 讀取文件 /proc/binder/transactions
            BINDER STATS
            獲取該 log: 讀取文件 /proc/binder/stats
            BINDER PROCESS STATE
            獲取該 log: 讀取文件 /proc/binder/proc/*
            bind 相關(guān)的一些狀態(tài)
            FILESYSTEMS
            獲取該 log: 執(zhí)行 /system/bin/df
            主要文件的一些容量使用狀態(tài) (cache,sqlite,dev…)
            PACKAGE SETTINGS
            獲取該 log: 讀取文件 /data/system/packages.xml
            系統(tǒng)中 package 的一些狀態(tài) ( 訪問權(quán)限 , 路徑 …) ,類似 Windows 里面的一些 lnk 文件吧 .
            PACKAGE UID ERRORS
            獲取該 log: 讀取文件 /data/system/uiderrors.txt
            錯誤信息
            KERNEL LAST KMSG LOG
            最新 kernel message log
            LAST RADIO LOG
            最新 radio log
            KERNEL PANIC CONSOLE LOG
            KERNEL PANIC THREADS LOG
            控制臺 / 線程的一些錯誤信息 log
            BACKLIGHTS
            獲取該 log: 獲取 LCD brightness 讀 /sys/class/leds/lcd-backlight/brightness
            獲取該 log: 獲取 Button brightness 讀 /sys/class/leds/button-backlight/brightness
            獲取該 log: 獲取 Keyboard brightness 讀 /sys/class/leds/keyboard-backlight/brightness
            獲取該 log: 獲取 ALS mode 讀 /sys/class/leds/lcd-backlight/als
            獲取該 log: 獲取 LCD driver registers 讀 /sys/class/leds/lcd-backlight/registers
            獲取相關(guān)亮度的一些信息
            (2)build.prop
            VERSION INFO 輸出下列信息
            當前時間
            當前內(nèi)核版本 : 可以讀取文件 (/proc/version) 獲得
            顯示當前命令 : 可以讀取文件夾 (/proc/cmdline) 獲得
            顯示系統(tǒng) build 的一些屬性 : 可以讀取文件 (/system/build.prop) 獲得
            輸出系統(tǒng)一些屬性
            gsm.version.ril-impl
            gsm.version.baseband
            gsm.imei
            gsm.sim.operator.numeric
            gsm.operator.alpha

           (3)dumpsys
            執(zhí)行 /system/bin/dumpsys 后可以獲得這個 log.
            經(jīng)常會發(fā)現(xiàn)該 log 輸出不完整 , 因為代碼里面要求該工具最多只執(zhí)行 60ms, 可能會導(dǎo)致 log 無法完全輸出來 .
            可以通過修改時間參數(shù)來保證 log 完全輸出 .
            信息 :
            Currently running services
            DUMP OF SERVICE services-name(running)
            Log Code Analysis
            Site: .\frameworks\base\cmds\dumpstate\
            相關(guān) Log 程序的代碼可以從上面目錄獲取
            Log Analysis Experience
            分析步驟
            1. 查看一些版本信息
            確認問題的系統(tǒng)環(huán)境
            2. 查看 CPU/MEMORY 的使用狀況
            看是否有內(nèi)存耗盡 ,CPU 繁忙這樣的背景情況出現(xiàn) .
            3. 分析 traces
            因為 traces 是系統(tǒng)出錯以后輸出的一些線程堆棧信息 , 可以很快定位到問題出在哪里 .
            4. 分析 SYSTEM LOG
            系統(tǒng) Log 詳細輸出各種 log, 可以找出相關(guān) log 進行逐一分析
            實例分析
            下面分析我寫的一個測試例子 , 在 OnCreate 做一個死循環(huán) , 這樣主線程會被鎖住,在按下硬件的 Back 之后會出現(xiàn) ANR 的錯誤 .
            在 traces 中發(fā)現(xiàn)該程序的堆棧信息如下 :
          —– pid 20597 at 2010-03-15 01:29:53 —–
          Cmd line: com.android.test
          DALVIK THREADS:
          "main" prio=5 tid=3 TIMED_WAIT
          | group="main" sCount=1 dsCount=0 s=N obj=0x2aac6240 self=0xbda8
          | sysTid=20597 nice=0 sched=0/0 cgrp=default handle=1877232296
          at java.lang.VMThread.sleep(Native Method)
          at java.lang.Thread.sleep(Thread.java:1306)
          at java.lang.Thread.sleep(Thread.java:1286)
          at android.os.SystemClock.sleep(SystemClock.java:114)
          at com.android.test.main.onCreate(main.java:20)
          at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
          at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
          at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
          at android.app.ActivityThread.access$2200(ActivityThread.java:119)
          at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
          at android.os.Handler.dispatchMessage(Handler.java:99)
          at android.os.Looper.loop(Looper.java:123)
          at android.app.ActivityThread.main(ActivityThread.java:4363)
          at java.lang.reflect.Method.invokeNative(Native Method)
          at java.lang.reflect.Method.invoke(Method.java:521)
          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
          at dalvik.system.NativeStart.main(Native Method)
          "Binder Thread #2" prio=5 tid=11 NATIVE
          | group="main" sCount=1 dsCount=0 s=N obj=0x2fb7c260 self=0×143860
          | sysTid=20601 nice=0 sched=0/0 cgrp=default handle=1211376
          at dalvik.system.NativeStart.run(Native Method)
          "Binder Thread #1" prio=5 tid=9 NATIVE
          | group="main" sCount=1 dsCount=0 s=N obj=0x2fb7c1a0 self=0x14c980
          | sysTid=20600 nice=0 sched=0/0 cgrp=default handle=1207920
          at dalvik.system.NativeStart.run(Native Method)
          "Signal Catcher" daemon prio=5 tid=7 RUNNABLE
          | group="system" sCount=0 dsCount=0 s=N obj=0x2fb7a1e8 self=0x126cc0
          | sysTid=20599 nice=0 sched=0/0 cgrp=default handle=1269048
          at dalvik.system.NativeStart.run(Native Method)
          "HeapWorker" daemon prio=5 tid=5 VMWAIT
          | group="system" sCount=1 dsCount=0 s=N obj=0x2e31daf0 self=0x135c08
          | sysTid=20598 nice=0 sched=0/0 cgrp=default handle=1268528
          at dalvik.system.NativeStart.run(Native Method)
          —– end 20597 —–
            該文件的堆棧結(jié)構(gòu)從下往上進行分析
            (1) 棧底 at dalvik.system.NativeStart.run(Native Method)
            系統(tǒng)為當前的 task( 應(yīng)用程式 ) 啟動一個專用的虛擬機
            (2) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
            Activity Services 是在后臺負責(zé)管理 Activity, 它此時將測試例子的 Activity 啟動起來了
            (3)at com.android.test.main.onCreate(main.java:20)
            啟動測試程序
            (4) 棧頂 at java.lang.VMThread.sleep(Native Method)
            線程被 sleep 掉了 , 所以無法響應(yīng)用戶 , 出現(xiàn) ANR 錯誤 .
            上面是對一個非常簡單的問題的分析 .
            如果遇到比較復(fù)雜的問題還需要詳細分析 SYSTEM LOG.
            1. 比如網(wǎng)絡(luò)異常 , 要通過 SYSTEM LOG 里面輸出的網(wǎng)絡(luò)鏈接信息來判斷網(wǎng)絡(luò)狀態(tài)
            2. 數(shù)據(jù)傳輸 , 網(wǎng)絡(luò)鏈接等耗時的操作需要分析 SYSTEM LOG 里面 ActivityManager 的響應(yīng)時間
            3…

          posted on 2014-03-28 11:12 順其自然EVO 閱讀(210) 評論(0)  編輯  收藏 所屬分類: android

          <2014年3月>
          2324252627281
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 怀柔区| 独山县| 丹巴县| 茶陵县| 荔浦县| 迁西县| 镇远县| 惠安县| 桂平市| 白水县| 厦门市| 平度市| 永州市| 大荔县| 巫山县| 大方县| 灵山县| 通许县| 金寨县| 泽州县| 高邮市| 铁岭县| 灌南县| 曲周县| 曲靖市| 开封县| 晋城| 台中市| 儋州市| 报价| 阿坝县| 新乡市| 西青区| 石台县| 涪陵区| 牟定县| 台湾省| 孟村| 靖州| 泰来县| 雅安市|