1.查看當前堆棧 Call tree | new Exception(“print trace”).printStackTrace(); (在logcat中打印當前函數調用關系) |
2.MethodTracing 性能分析與優( 函數占用CPU時間, 調用次數, 函數調用關系) | a) 在程序代碼中加入追蹤開關 import android.os.Debug; … android.os.Debug.startMethodTracing(“/data/tmp/test”);//先建/data/tmp目錄 …//被追蹤程序段 android.os.Debug.stopMethodTracing(); b)編譯,運行后,設備端生成/data/tmp/test.trace文件 c)把trace文件復制到PC端 $adb pull /data/tmp/test.trace/ d)使用android自帶工具分析trace文件 $$ANDROID_SRC/out/host/linux-x86/bin/traceview?test.trace 此時可看到各個函數被調用的次數CPU占用率等信息 e)使用android自帶工具分析生成調用關系類圖 $apt-get install graphviz #安裝圖片相關軟件 $ANDROID_SRC/out/host/linux-x86/bin/dmtracedump –g test.png test.trace 此時目錄下生成類圖test.png (注意:trace文件生成與libdvm模塊DEBUG版本相沖突,所以此方法只適用于對非DEBUG版本模擬器的調試,否則在分析trace文件時會報錯) |
3.HProf (Heap Profile) (內存占用, 及泄漏分析) | a) 在代碼中加入dump動作 import android.os.Debug; import java.io.IOException; …… try{ android.os.Debug.dumpHprofData(“/data/tmp/input.hprof”);//預先建立/data/tmp }catch(IOException ioe){ } b) 把hprof文件復制到PC端 $adb pull /data/tmp/input.hprof ./ c)使用命令hprof-conv把hprof轉成MAT識別的標準的hprof $$ANDROID_SRC/out/host/linux-x86/bin/hprof-conv input.hprof output.hprof d) 使用MAT工具看hprof信息 下載MAT工具:http://www.eclipse.org/mat/downloads.php 用工具打開output.hprof (注意:此工具只顯示java層面而不能顯示C層內存占用信息) |
4.SamplingProfile (要求android 2.0+) 每隔N毫秒對當前正在 運行的函數取樣, 并輸出到log中 | 在代碼中加入取樣設定 import dalvik.system.SamplingProfiler … SamplingProfile sp=SamplingProfiler.getInstance(); sp.start(n);//n為設定每秒采樣次數 sp.logSnapshot(sp.snapshot()); … sp.shutDown(); (自動啟動一個線程監測,在logcat中打印信息) |
5.通過發送系統信號 獲取Call tree與 內存信息 | 1) 原理dalvik虛擬機對SIGQUIT和SIGUSR1信號進行處理 (dalvik/vm/SignalCatcher.c),分別完成取當前堆棧和取當前內存情況的功能 2)用法 a) $ chmod 777 /data/anr -R # 把anr目錄權限設為可寫 $ rm /data/anr/traces.txt # 刪除之前的trace信息 $ ps # 找到進程號 $ kill -3 進程號 # 發送SIGQUIT信號給該進程,此時生成trace信息 $ cat /data/anr/traces.txt 功能實現:遍歷thread list(dalvik/vm/Thread.c:dvmDumpAllThreadEx()),并打印當前函數調用關系(dalvik/vm/interp/Stack.c:dumpFrames()) b) $ chmod 777 /data/misc –R $ ps # 找到進程號 $ kill -10 進程號 # 發送SIGQUIT信事信號給該進程,此時生成hprof信息 $ ls /data/misc/*.hprof 此時生成hprf文件,如何查看此文件,見第2部分(HProf) (注意:hprof文件很大,注意用完刪除,以免占滿存儲器) |
6.logcat | 1) android.util.Log利用println的標準java輸出詞句,并加前綴I/V/D…. 2) dalvik利用管道加線程方式,先利用dup2把stdout和stderr重定向到管理中(vm/StdioConverter.c:dvmstdioConverterStartup),然后再啟動一個線程從管道另一端讀出內容 (dalvik/vm/StdioConverter.c:stdioconverterThreadStart()),使用LOG公共工具(system/core/liblog/logd_write.c: __android_log_print())輸出到/dev/log/*中 3)logcat通過加不同參數看/dev/log/下的不同輸入信息 #logcat –b main顯示主緩沖區中的信息 #logcat –b radio 顯示無線緩沖區中的信息 #logcat –b events顯示事件緩沖區中的信息 |
7.jdwp(java debug wire protocol)及原理 | 1) 虛擬機(設備端)在啟動時加載了Agent JDWP 從而具備了調試功能。在調試器端(PC端)通過JDWP協議與設備連接,通過發送命令來獲取的狀態和控制Java程序的執行。JDWP 是通過命令(command)和回復(reply)進行通信的。 2) JDK 中調試工具 jdb 就是一個調試器,DDMS也提供調試器與設備相連。 3) dalvik為JDWP提供了兩種連接方式:tcp方式和adb方式,tcp方式可以手工指定端口,adb方式自動設定為8700端口,通常使用DDMS調試就是通過adb方式 |
8.monkey壓力測試 | android自帶的命令行工具。它向系統發送偽隨機的用戶事件流,實現對正在開發的應用程序進行壓力測試。 在設備端打開setting界面 $ adb shell #monkey –p com.android.settings -v 500 此時可以看到界面不斷被切換 |
9.查看Android源碼 Eclipse插件 | sqlitemanager插件,實時查看寫入db數據的改變 sqllitemanger插件的用法: Using SQLite in ANDROID You can see the sqlite database in eclipse by opening File Explorer .Then /data/data/package_name/databases But here we cannot see the tables and table data. sqlitemanager下載. (注意:如果是寫入至系統臨時目錄db,則需root) |
10.SQLiteManager plugin for eclipse | sqlitemanager插件,實時查看寫入db數據的改變 sqllitemanger插件的用法: Using SQLite in ANDROID You can see the sqlite database in eclipse by opening File Explorer .Then /data/data/package_name/databases But here we cannot see the tables and table data. sqlitemanager下載. 注意:(如果是寫入系統臨時目錄db,則需root) |
11.自定義內存日志 | 通過獨立的界面顯示 |
12.try catch的快捷鍵 | 快捷鍵ctrl + alt + t |
轉載于:https://www.cnblogs.com/reboost/p/9540513.html