qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

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

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

           2.bugreport 結構分析
            (1)dumpstate
            MEMORY INFO
            獲取該 log: 讀取文件 /proc/meminfo
            系統內存使用狀態
            CPU INFO
            獲取該 log: 執行 /system/bin/top -n 1 -d 1 -m 30 -t
            系統 CPU 使用狀態
            PROCRANK
            獲取該 log: 執行 /system/bin/procrank
            執行 /system/xbin/procrank 后輸出的結果 , 查看一些內存使用狀態
            VIRTUAL MEMORY STATS
            獲取該 log: 讀取文件 /proc/vmstat
            虛擬內存分配情況
            vmalloc 申請的內存則位于 vmalloc_start ~ vmalloc_end 之間,與物理地址沒有簡單的轉換關系,雖然在邏輯上它們也是連續的,但是在物理上它們不要求連續。
            VMALLOC INFO
            獲取該 log: 讀取文件 /proc/vmallocinfo
            虛擬內存分配情況
            SLAB INFO
            獲取該 log: 讀取文件 /proc/slabinfo
            SLAB 是一種內存分配器 . 這里輸出該分配器的一些信息
            ZONEINFO
            獲取該 log: 讀取文件 /proc/zoneinfo
            zone info
            SYSTEM LOG( 需要著重分析 )
            獲取該 log: 執行 /system/bin/logcat -v time -d *:v
            會輸出在程序中輸出的 Log, 用于分析系統的當前狀態
            VM TRACES
            獲取該 log: 讀取文件 /data/anr/traces.txt
            因為每個程序都是在各自的 VM 中運行的 , 這個 Log 是現實各自 VM 的一些 traces
            EVENT LOG TAGS
            獲取該 log: 讀取文件 /etc/event-log-tags
            EVENT LOG
            獲取該 log: 執行 /system/bin/logcat -b events -v time -d *:v
            輸出一些 Event 的 log
            RADIO LOG
            獲取該 log: 執行 /system/bin/logcat -b radio -v time -d *:v
            顯示一些無線設備的鏈接狀態 , 如 GSM , PHONE,STK(Satellite Tool Kit)…
            NETWORK STATE
            獲取該 log: 執行 /system/bin/netcfg ( 得到網絡鏈接狀態 )
            獲取該 log: 讀取文件 /proc/net/route ( 得到路由狀態 )
            顯示網絡鏈接和路由
            SYSTEM PROPERTIES
            獲取該 log: 參考代碼實現
            顯示一些系統屬性 , 如 Version,Services,network…
            KERNEL LOG
            獲取該 log: 執行 /system/bin/dmesg
            顯示 Android 內核輸出的 Log
            KERNEL WAKELOCKS
            獲取該 log: 讀取文件 /proc/wakelocks
            內核對一些程式和服務喚醒和休眠的一些記錄
            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: 執行 ps -P
            顯示當前進程
            PROCESSES AND THREADS
            獲取該 log: 執行 ps -t -p -P
            顯示當前進程和線程
            LIBRANK
            獲取該 log: 執行 /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 相關的一些狀態
            FILESYSTEMS
            獲取該 log: 執行 /system/bin/df
            主要文件的一些容量使用狀態 (cache,sqlite,dev…)
            PACKAGE SETTINGS
            獲取該 log: 讀取文件 /data/system/packages.xml
            系統中 package 的一些狀態 ( 訪問權限 , 路徑 …) ,類似 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
            獲取相關亮度的一些信息
            (2)build.prop
            VERSION INFO 輸出下列信息
            當前時間
            當前內核版本 : 可以讀取文件 (/proc/version) 獲得
            顯示當前命令 : 可以讀取文件夾 (/proc/cmdline) 獲得
            顯示系統 build 的一些屬性 : 可以讀取文件 (/system/build.prop) 獲得
            輸出系統一些屬性
            gsm.version.ril-impl
            gsm.version.baseband
            gsm.imei
            gsm.sim.operator.numeric
            gsm.operator.alpha

           (3)dumpsys
            執行 /system/bin/dumpsys 后可以獲得這個 log.
            經常會發現該 log 輸出不完整 , 因為代碼里面要求該工具最多只執行 60ms, 可能會導致 log 無法完全輸出來 .
            可以通過修改時間參數來保證 log 完全輸出 .
            信息 :
            Currently running services
            DUMP OF SERVICE services-name(running)
            Log Code Analysis
            Site: .\frameworks\base\cmds\dumpstate\
            相關 Log 程序的代碼可以從上面目錄獲取
            Log Analysis Experience
            分析步驟
            1. 查看一些版本信息
            確認問題的系統環境
            2. 查看 CPU/MEMORY 的使用狀況
            看是否有內存耗盡 ,CPU 繁忙這樣的背景情況出現 .
            3. 分析 traces
            因為 traces 是系統出錯以后輸出的一些線程堆棧信息 , 可以很快定位到問題出在哪里 .
            4. 分析 SYSTEM LOG
            系統 Log 詳細輸出各種 log, 可以找出相關 log 進行逐一分析
            實例分析
            下面分析我寫的一個測試例子 , 在 OnCreate 做一個死循環 , 這樣主線程會被鎖住,在按下硬件的 Back 之后會出現 ANR 的錯誤 .
            在 traces 中發現該程序的堆棧信息如下 :
          —– 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 —–
            該文件的堆棧結構從下往上進行分析
            (1) 棧底 at dalvik.system.NativeStart.run(Native Method)
            系統為當前的 task( 應用程式 ) 啟動一個專用的虛擬機
            (2) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
            Activity Services 是在后臺負責管理 Activity, 它此時將測試例子的 Activity 啟動起來了
            (3)at com.android.test.main.onCreate(main.java:20)
            啟動測試程序
            (4) 棧頂 at java.lang.VMThread.sleep(Native Method)
            線程被 sleep 掉了 , 所以無法響應用戶 , 出現 ANR 錯誤 .
            上面是對一個非常簡單的問題的分析 .
            如果遇到比較復雜的問題還需要詳細分析 SYSTEM LOG.
            1. 比如網絡異常 , 要通過 SYSTEM LOG 里面輸出的網絡鏈接信息來判斷網絡狀態
            2. 數據傳輸 , 網絡鏈接等耗時的操作需要分析 SYSTEM LOG 里面 ActivityManager 的響應時間
            3…

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

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

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 两当县| 太谷县| 滕州市| 建水县| 新化县| 嘉祥县| 溆浦县| 玉门市| 新巴尔虎左旗| 玛曲县| 克拉玛依市| 五河县| 海南省| 澄江县| 成都市| 错那县| 贞丰县| 舞阳县| 平度市| 徐水县| 南岸区| 焦作市| 晋中市| 广元市| 万安县| 巨鹿县| 平顶山市| 抚顺县| 连平县| 密云县| 莒南县| 陕西省| 磴口县| 邵东县| 乡城县| 祥云县| 西城区| 泾源县| 彰化市| 泽州县| 清苑县|