天天看點

App調試的幾個指令實踐【轉】App調試的幾個指令實踐【轉】

App調試的幾個指令實踐【轉】

在Android的應用開發中,我們會用到各種代碼調試;其實在Android的開發之後,我們可能會碰到一些随機的問題,如cpu過高,記憶體洩露等,我們無法簡單的進行代碼調試,我們需要一個系統日志等等,下面我把握工作中碰到的幾個常用指令和方法給大家示範實踐一下。

1.logcat指令

這個指令最簡單常用,可檢視幫助,我不多說,如果需要列印時間,加參數-v time

1
adb logcat -v time           

2.bugreport指令

這個指令也非常簡單,但是在實際應用中非常有用,會有從開機之後詳細的dumpsys,dumpstate和logcat資訊,是一份完整的日志記錄。對分析使用者行為,異常資訊,系統狀态有很大的參考作用。一般我們會把bugreport導出到電腦上分析。

1
adb bugreport > xxx.log           

我再次強調,bugreport裡面包含豐富的系統和使用者資訊,它是其他很多指令輸出的結果的記錄,非常有用。

3.dumpsys指令

這個檢視系統資訊,用的還是比較多的.

1
2
3
4
5
6
7
dumpsys [options]
               meminfo 顯示記憶體資訊
               cpuinfo 顯示CPU資訊
               account 顯示accounts資訊
               activity 顯示所有的activities的資訊
               window 顯示鍵盤,視窗和它們的關系
               wifi 顯示wifi資訊           

例如檢視某個程式記憶體資訊:

1
2
#檢視應用com.tianxia.test的記憶體使用情況
adb shell dumpsys meminfo com.tianxia.test           

效果圖如下:

App調試的幾個指令實踐【轉】App調試的幾個指令實踐【轉】

裡面的資訊很有價值,尤其對于分析記憶體洩露,記憶體溢出都有極大的作用。

4.top指令

這個檢視cpu資訊太友善了。

1
top -m 5 -t           

我們看看效果圖,其中按cpu大小列出5個程序清單。

App調試的幾個指令實踐【轉】App調試的幾個指令實踐【轉】

com.tianxia.test的cpu過高,會導緻手機發燙。同時利用這個資訊,可以監控應用cpu的使用,以調整優化代碼。

5.配置檔案local.prop

目前網上沒有查到local.prop的配置使用,工作中本人隻使用過如下:

1
log.tag.SQLiteStatements=VERBOSE log.tag.SQLiteTime=VERBOSE           

把上述文本加到/data/local.prop中,如果沒有這個檔案自行建立。然後重新開機手機,就能看到每個應用詳細的查詢資料庫的sql語句資訊,對于調試資料庫,分析和優化資料庫sql異常非常有用。

6.分析手機發燙

下面我們來實踐一個例子,手機發燙太厲害,怎麼找出問題?

首先我們寫一個程式com.tianxia.test,死循環,核心代碼如下:

1
2
3
4
5
6
7
8
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    while(true) {
        System.currentTimeMillis();
    }
}           

這個應用打開後會一直擷取系統時間,因為在主線程,肯定導緻應用ANR,也會一直浪費系統cpu,手機發熱,我們運作它。

假設我們不知道上述代碼,我們來找到這個問題:

(1).找到發燙的應用。

使用top指令:

1
top -m 5 -t           
App調試的幾個指令實踐【轉】App調試的幾個指令實踐【轉】

一看是com.tianxia.test占用85%的cpu,原來是這家夥在搗鬼。程序ID是644,這個後面我們有用。

(2).分析發燙的應用程序在幹嘛

需要用到linux下的strace指令,但是android是沒有內建這個指令的,android版本的下載下傳位址:

http://benno.id.au/android/strace

下載下傳完成後,上傳到手機中:

我們adb push strace /system/bin,在模拟器上是上傳到/system/bin會報out of memory錯誤,我們也可以上傳到/data目錄下,如果沒有執行權限,還需要chmod 777 strace.

strace指令有很多參數,直接執行strace會顯示使用說明:

App調試的幾個指令實踐【轉】App調試的幾個指令實踐【轉】

其中-p參數輸入的就是程序号,第一步中我們找到com.tianxia.test的程序ID是644,我們看看這個應用占用這麼高的cpu在幹嘛?

1
strace -p 644           

輸出如下:

App調試的幾個指令實踐【轉】App調試的幾個指令實踐【轉】

它的系統調用一直是gettimeofday,一直輸出這個,顯然哪裡一定進入死循環了,而且是擷取時間的死循環,然後結合logcat和代碼,定位這段代碼(就是前面我們給出的那段代碼了)解決這個bug。

7.采集手機的cpu運作情況.

有時使用日志我們很難針對性的擷取我們想要的資訊,我們可能需要寫一些最簡單的腳步放在手機裡面執行。

如監控cpu占用的記錄cpu_log.sh:

1
2
3
4
5
6
7
8
9
10
11
# !/system/bin/sh
#這個腳步比較粗糙,是這麼個意思
file=/sdcard/cpu/cpu_info.log
rm $file
until [ 1 -gt 10000 ]
do
echo -e "\n\n\n\n\n---------------">>$file
date >> $file
top -m 5 -n 1 >> $file
sleep 3
done           

每隔3s中就會把手機的cpu的資訊寫到sdcard的cpu目錄下的cpu_info.log檔案中,友善我們後續分析。

ps:使用方法是 push到data目錄下,賦予可執行權限,在shell下執行即可。

8.采集某個應用的記憶體資料

這個實踐和上面的腳本類似,隻是指令不一樣我另外單獨列出來,因為這個有時候很有用。

比如,我們要采集com.tianxia.test的記憶體使用情況,分析它是不是會記憶體洩露,腳步類似:

1
2
3
4
5
6
7
8
9
10
11
# !/system/bin/sh
#這個腳步比較粗糙,是這麼個意思
file=/sdcard/cpu/mem_info.log
rm $file
until [ 1 -gt 10000 ]
do
echo -e "\n\n\n\n\n---------------">>$file
date >> $file
dumpsys meminfo com.tianxia.test >> $file
sleep 3
done           

使用方法也是一樣。

9.小結

零零碎碎的一直沒有時間整理,有常用的也有不常用的,算是一些小技巧,感覺網上這方面的分享比較少,有時和朋友們談起這些調試方法,特别是龍哥,硬是要求我今天寫出來與大家分享,隻好獻醜,說不定對于解決一些疑難雜症有奇效,呵呵,想到什麼寫什麼吧,想到幾個寫幾個,也是一個學習的記錄。

參考原文連結:http://www.cnblogs.com/qianxudetianxia/archive/2012/05/14/2497073.html

EOF