1. 程式人生 > >12種你不得不知的Android除錯方式

12種你不得不知的Android除錯方式

1. 檢視當前堆疊

1) 功能:在程式中加入程式碼,使可以在logcat中看到打印出的當前函式呼叫關係

2) 方法: 
new Exception(“print trace”).printStackTrace();

2. MethodTracing

1) 功能:用於熱點分析和效能優化,分析每個函式佔用的CPU時間,呼叫次數,函式呼叫關係等

2) 方法:

a) 在程式程式碼中加入追蹤開關

  1. import android.os.Debug;     
  2. ……     
  3. android.os.Debug.startMethodTracing(“/data/tmp/test”); // 先建/data/tmp目錄   
  4. …… // 被追蹤的程式段  
  5.  android.os.Debug.stopMethodTracing();  

b) 編譯,執行後,裝置端生成/data/tmp/test.trace檔案

c) 把trace檔案複製到PC端

  1. $ adb pull /data/tmp/test.trace ./ 

d) 使用android自帶工具分析trace檔案

  1. $ $ANDROID_SRC/out/host/linux-x86/bin/traceview test.trace  

此時可看到各個函式被呼叫的次數CPU佔用率等資訊

e) 使用android自帶工具分析生成呼叫關係類圖

  1. $ apt-get install graphviz # 安裝圖片相關軟體   
  2. $ANDROID_SRC/out/host/linux-x86/bin/dmtracedump -g test.png test.trace  

此時目錄下生成類圖test.png

3) 注意 
trace檔案生成與libdvm模組DEBUG版本相沖突,所以此方法只適用於對非DEBUG版本模擬器的除錯,否則在分析trace檔案時會報錯

3. HProf (Heap Profile)

1) 功能: 
用於java層面的記憶體分析,顯示詳細的記憶體佔用資訊,指出可疑的記憶體洩漏物件

2) 方法:

a) 在程式碼中加入dump動作

  1. import android.os.Debug;    
  2. import java.io.IOException;     
  3. ……     
  4. try {    
  5. android.os.Debug.dumpHprofData(“/data/tmp/input.hprof”); 
    // 先建/data/tmp目錄   
  6.  } catch (IOException ioe) {     
  7.  } 

b) 把hprof檔案複製到PC端

  1. $ adb pull /data/tmp/input.hprof ./ 

c) 使用命令hprof-conv把hprof轉成MAT識別的標準的hprof

  1. $ $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

3) 注意:此工具只能顯示java層面的,而不能顯示C層的記憶體佔用資訊

4. SamplingProfile (android 2.0上版本使用)

1) 功能 
每隔N毫秒對當前正在執行的函式取樣,並輸出到log中

2) 在程式碼中加入取樣設定

  1. import dalvik.system.SamplingProfiler     
  2. ……    
  3. SamplingProfile sp = SamplingProfiler.getInstance();     
  4. sp.start(n); // n為設定每秒取樣次數   
  5.  sp.logSnapshot(sp.snapshot());     
  6.  ……     
  7. sp.shutDown(); 

它會啟一個執行緒監測,在logcat中列印資訊

5. 用發系統訊號的方式取當前堆疊情況和記憶體資訊

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檔案,如何使用此檔案,見第二部分(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/下的不同輸入資訊

  1. # logcat -b main 顯示主緩衝區中的資訊   
  2. # logcat -b radio 顯示無線緩衝區中的資訊   
  3. # 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

1) monkey是一個android自帶的命令列工具。它向系統傳送偽隨機的使用者事件流,實現對正在開發的應用程式進行壓力測試。

2) 方法 
在裝置端開啟setting介面 
$ adb shell 
# monkey -p com.android.settings -v 500 
此時可以看到介面不斷被切換

     9  檢視Android原始碼的Eclipse外掛

網上能夠搜到的Eclipse關聯Android原始碼的方法,基本上都是下載原始碼,然後關聯,或者就是在SDK Manager裡面下載原始碼(還不是所有版本的原始碼都能下載),其實還有一種很方便的方法,但是這種方法是否有什麼缺點,我還不是很清楚,不過似乎這種方法也是通過下載原始碼的方式實現檢視原始碼的,但是,每次只下載需要的部分,只是似乎。

這個方法就是使用Eclipse外掛的方法,外掛地址為:

http://adt-addons.googlecode.com/svn/trunk/source/com.android.ide.eclipse.source.update

這個方法非常簡單,之所以我會寫出來,就是因為,三翻四次的用到了,而這個地址又三翻四次的找了很久。希望對大家有所幫助。

檢視Android原始碼的Eclipse外掛 —— Juwend  

    10  SQLiteManager plugin for eclipse

我們經常都會講資料寫入到db檔案中,如果能夠實時看到db中的資料的改變,是不是除錯更有效率呢?這裡就推薦sqlitemanager外掛(注意:如果是寫入到系統臨時目錄的db則要檢視我們的機子需要root了)

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.
For viewing the table details Eclipse has a plugin. You can download the jar from below.

sqlitemanager想要下載的話可以從這裡進行下載    here.

下面我貼下執行結果出來的樣子

【Android開發必備工具】幾款超酷的Eclipse外掛+10 - 87426628 - 小魚的部落格

11. 其它小工具 
具體見android.os.Debug中提供的工具

1) 取毫微秒級的時間,用於計算時間 
threadCpuTimeNanos()

2) 統計兩點間的記憶體分配情況

  1. startAllocCounting()   
  2. stopAllocCounting()   
  3. getGlobalAllocCount()   
  4. get….. 

3) 列印當前已load的class 
getLoadedClassCount() 
printLoadedClasses() 它需要開啟NDEBUG功能才能開啟system/core/中Log功能

12. 列印debug資訊 

相關推薦

12不得不知Android除錯方式

1. 檢視當前堆疊1) 功能:在程式中加入程式碼,使可以在logcat中看到打印出的當前函式呼叫關係2) 方法: new Exception(“print trace”).printStackTrace();2. MethodTracing1) 功能:用於熱點分析和效能優化,分析每個函式佔用的CPU時間,呼叫

細數不得不知的容器安全工具

docker 工具 網絡安全 鏡像 引擎 容器 網絡安全問題的重要性大概毋庸置疑,最近無數關於惡意軟件和安全漏洞的消息已充分證明了這一點。假如你要管理一個Docker環境,並希望幫助自己的公司或用戶在下一個大漏洞來臨時避免遇到麻煩,那麽你就需要了解一些保障Docker應用安全的工具,並

做用戶體驗設計,不得不知的18件事

以下內容由Mockplus團隊翻譯整理,僅供學習交流,Mockplus是更快更簡單的原型設計工具。 沒有人會告訴你的設計小竅門 我在40歲的時後改變了我的職業生涯,成為了一名UX設計師。2014年,我在澳大利亞悉尼完成了一個為期3個月的UX設計課程。課程完成後,我仍然有很多東西要

TCP/IP中不得不知的十大秘密

比特 smt 鏈路 復數 增長 超過 工具 地址解析 gmp 這段時間 有一點心很浮躁,不過希望自己馬上要矯正過來。好好學習編程!這段時間我想好好地研究一下TCP/IP協議和網絡傳輸這塊!加油 一、TCP/IP模型 TCP/IP協議模型(Transmission Con

OCR----不得不知的Tesseract六大重要核心

Abstract 整理了很多OCR的資料,這篇主要是對Tesseract重要的知識進行總結羅列。本次總結,基於2007年Smith所寫的Paper—-《An Overview of the Tesseract OCR Engine》,所以算是論文導讀吧。PS:Smith是一個專

C語言之不得不知的指標(二)

 C語言之你不得不知的指標(二)         指標是一個地址,指標變數是存放地址的變數。通過下面這幾段程式可以很好的理解指標和指標變數。              

C語言之不得不知的陣列(一)

1、強制型別轉換運算子:     (double)a --------------------(將a轉換為double型別)     (int)(x+y)-------------------(將x+y的值轉換為int型別)   &n

Kubernetes 1.5有哪些不得不知的新功能?_Kubernetes中文社群

今年9月份我們迎來了Kubernetes 1.4的驚喜釋出,一大波新功能讓人眼花繚亂。經過將近三個月時間的打磨,如今Kubernetes再推出新版本,翹首以盼的Kubernetes 1.5重磅釋出,本次版本更新涵蓋了4個主題、12個新特性以及4個原有基礎上的重大變更。期待不如眼疾手快,翻閱文章

每個專案中,不得不知的11個Java第三方類庫

單元測試 DBunit是一個基於junit擴充套件的資料庫測試框架。它提供了大量的類對與資料庫相關的操作進行了抽象和封裝。 Mockito是一個針對Java的mocking框架。你可以使用簡潔的API編寫出漂亮的測試。 Hamcrest 是一個測試輔助工

如果喜歡Python 那麼不得不知的幾個開源專案

1.Trac Trac擁有強大的bug管理 功能,並集成了Wiki 用於文件管理。它還支援程式碼管理工具Subversion ,這樣可以在 bug管理和Wiki中方便地參考程式原始碼。 Trac有著比較強大的外掛系統,可以通過外掛來實現各種各樣的功能,比如支援G

揭祕“風水界”不得不知的那些事

  風水師大家都不“麥勝”吧!古往今來都有相關記載,看個風水、選個陰宅那是“小菜一碟”。不管是哪路“神仙”都自稱是可以逢凶化吉的“風水大師”,其實不然。 風水師在宋代比較盛行,到明清就變得氾濫,看似在我國解放理論時期的影響下受到了“重創”,但實際中還在不斷運用,到目前為止,

有趣!10個不得不知的Linux終端遊戲

關注「實驗樓」,每天分享一個專案教程   Linux 終端在多數人眼中,是一個非常單調和無聊的工

不得不知的邏輯或(||)與(&&)非(!)

       最近重新翻開原生JS,又得到很多不同的體會,雖然現在開發框架那麼多,但很多思想都還是離不開原生的基礎。今天呢,我就根據自己的學習總結一下邏輯與(&&)和(邏輯或(||)和邏輯非(!)。       基本定義       ||:邏輯或,只有表示式的值都為false,才返回false

JVM 中不得不知的一些引數

有的同學雖然寫了一段時間 Java 了,但是對於 JVM 卻不太關注。有的同學說,引數都是團隊規定好的,部署的時候也不用我動手,關注它有什麼用,而且,JVM 這東西,聽上去就感覺很神祕很高深的樣子,還是算了吧。 沒錯,部署的時候可能用不到你親自動手,但是出現問題了怎麼辦,難道不用你解決問題嗎,如果對 JVM

前端開發:這10個Chrome擴充套件不得不知

轉載請註明出處:葡萄城官網,葡萄城為開發者提供專業的開發工具、解決方案和服務,賦能開發者。 原文出處:https://blog.bitsrc.io/10-top-chrome-extensions-for-front-end-developers-db23a01dce1e 1. CSSViewer &nb

電腦科學之演算法——不得不知的遞迴

# 遞迴 >本系列文章在Github:[StevenEco](https://github.com/StevenEco/ComputerScience)以及[WarrenRyan](https://www.cnblogs.com/warrenryan)同步更新 ## 簡介 程式呼叫自身的程式設計技巧稱為

升級Kubernetes 1.18前,不得不知的9件事

本文來自Rancher Labs 昨天Kubernetes最新版本v1.18已經發布,其包含了38項功能增強,其中15項為穩定版功能、11項beta版功能以及12項alpha版功能。在本文中,我們將探索其中一些功能,希望能幫助你決定是否需要升級。那麼,我們現在開始吧! 將Service Account T

Android之UI--打造12Dialog對話框

指正 ati 整體 port login ast select log inflater 最近有空,來把app中常用到的Dialog對話框寫一篇博客,在app中很多地方都會用到Dialog對話框,今天小編我就給大家介紹Dialog對話框。 先看看效果圖:

Android Studio(IDEA) 不得不知的超實用的快捷鍵

工欲善其事必先利其器。本文彙集了開發中最常用的Android Studio快捷鍵,其他的我認為用的比較少的,我就 沒有在這裡介紹了,因為快捷鍵實在是太多了。 不管你是使用Mac OS還是使用Windows系統,可能不同的系統AndroidStudio的預設

Android新增檔案開啟方式,將的app加入開啟方式

如何讓自己的軟體出現在開啟方式的列表中呢? 通過設定AndroidManifest.xml檔案即可: <activity android:name=".MainActivity" android:label="@string/app_name" android:launchMode="s