這篇寫Android studio debug技巧我的以爲寫得不錯,轉自:http://www.jianshu.com/p/011eb88f4e0d#java
Android Studio目前已經成爲開發Android的主要工具,用熟了可謂至關順手。做爲開發者,調試並發現bug,進而解決,但是咱們的看家本領。正所謂,工欲善其事必先利其器,和其餘開發工具同樣,如Eclipse、Idea,Android Studio也爲咱們提供了強大的調試技巧,今天咱們就來看看Android Studio中有關調試的技巧。android
首先,來看看Android studio中爲咱們提供的調試面板(標準狀況下):express
點擊右上角Restore ‘Threads’View可先展現目前相關的線程信息:多線程
android studio大致爲咱們提供了7個功能區:併發
下面咱們分別對這七個區域進行介紹。app
該區提供了調試的主要操做,和你所熟知的同樣的,主要有:Step over、step into、force step into、step out、drop frame。ide
點擊該按鈕,光標將定位到當前正在調試的位置.工具
單步跳過,點擊該按鈕將致使程序向下執行一行。若是當前行是一個方法調用,此行調用的方法被執行完畢後再到下一行。好比當前代碼是:開發工具
int num=10; int min=Math.min(num,100); System.out.println(min);
若是當前調試的是第二行,當點擊step over時,Math.min(num,100)方法先執行完後跳到第三行.this
單步跳入,執行該操做將致使程序向下執行一行。若是該行有自定義的方法,則進入該方法內部繼續執行,須要注意若是是類庫中的方法,則不會進入方法內部。
強制單步跳入,和step into功能相似,主要區別在於:若是當前行有任何方法,則無論該方法是咱們自行定義仍是類庫提供的,都能跳入到方法內部繼續執行
沒有好記的名字,大意理解爲中斷執行,並返回到方法執行的初始點,在這個過程當中該方法對應的棧幀會從棧中移除.換言之,若是該方法是被調用的,則返回到當前方法被調用處,而且全部上下文變量的值也恢復到該方法未執行時的狀態。簡單的舉例來講明:
public class DebugDemo { private String name = "default"; public void alertName() { System.out.println(name); debug(); } public void debug() { this.name = "debug"; } public static void main(String[] args) { new DebugDemo().alertName(); } }
當你在調試debug()時,執行該操做,將回調到debug()被調用的地方,也就是alertName()方法。若是此時再繼續執行drop frame,將回調到alertName()被調用的地方,也就是main().
很是好用的一個功能,能夠忽視已經存在的斷點,跳轉到光標所在處.舉個簡單例子說明下:
好比如今第10行,此時我想調試18行而又不想一步一步調試,能不能一次到位呢?咱們只須要將光標定位到相應的位置,而後執行Force Run to Cursor便可:
點擊該按鈕會在當前調試的語句處嵌入一個交互式解釋器,在該解釋器中,你能夠執行任何你想要執行的表達式進行求值操做。好比,咱們在調試時執行到如下代碼:
此時執行Evaluate Expression,就至關於在調試行以前嵌入了一個交互式解釋器,那麼在該解釋器中咱們能作什麼呢?在這裏,咱們能夠對result進行求值操做:對着你想要求值得位置點擊鼠標右鍵,選擇evaluate Expression.此時會顯示以下:
在彈出的輸入框中輸入求值表達式,好比這裏咱們輸入Math.min(result,50)
,以下圖
點擊執行,咱們發如今Result中已經輸出告終果,以下:
點擊該按鈕會中止目前的應用,而且從新啓動.換言之,就是你想要從新調試時,可使用該操做,嗯,就是從新來過的意思.
點擊該按鈕將暫停應用的執行.若是想要恢復則可使用下面提到的Resume Program.
該操做有恢復應用的含義,可是卻有兩種行爲:
public void test(){ test1(); ... test2(); }
假設咱們分別在第2行和第4行添加了斷點。若是此時咱們調試在第2行,此時點擊執行該操做,當前調試位置會自動執行到第4行,也就是第2到第4行之間的代碼會自動被執行。
點擊該按鈕會經過相關的關閉腳原本終止當前進程.換言之,對不一樣類型的工程可能有不一樣的中止行爲,好比:對普通的Java項目,點擊該按鈕意味着退出調試模式,可是應用還會執行完成.而在Android項目中,點擊該按鈕,則意味這app結束運行.
這裏咱們以一個普通的JAVA工程爲例:
此時若是咱們執行中止操做,發現程序退出調試模式,並正常執行完畢,Console中結果以下:
點擊該按鈕會進入斷點管理界面,在這裏你能夠查看全部斷點,管理或者配置斷點的行爲,如:刪除,修改屬性信息等:
使用該按鈕來切換斷點的狀態:啓動或者禁用.在調試過程當中,你能夠禁用暫時禁用全部的斷點,已實現應用正常的運行.該功能很是有用,好比當你在調試過程當中,忽然不想讓斷點干擾你所關心的流程時,能夠臨時禁用斷點.
獲取線程Dump,點擊該按鈕將進入線程Dump界面:
藉此咱們順便介紹一下dump界面:
線程工具區中最經常使用的是
,能夠用來過濾線程,其餘的不作解釋了
解析來咱們來認識一下線程的類型,表示爲不一樣的圖標:
線程狀態描述 | 圖標 |
---|---|
Thread is suspended. |
![]()
這裏寫圖片描述
|
Thread is waiting on a monitor lock. |
![]()
這裏寫圖片描述
|
Thread is running. |
![]()
這裏寫圖片描述
|
Thread is executing network operation, and is waiting for data to be passed. |
![]()
這裏寫圖片描述
|
Thread is idle. |
![]()
這裏寫圖片描述
|
Event Dispatch Thread that is busy. |
![]()
這裏寫圖片描述
|
Thread is executing disk operation. |
![]()
這裏寫圖片描述
|
點擊該按鈕將打開有關設置的列表:
咱們對其中的幾個進行說明:
調試過程當中開啓該功能,將會代碼右邊顯示變量值,即下圖中紅框所示部分:
調試過程當中啓用該功能,將在變量區顯示最後執行方法的返回值.舉個例子來講,首先,關閉該功能,咱們調試這段代碼並觀察其變量區:
開啓該功能以後,再來觀察變量區的變化:
繼續往下調試:
繼續往下調試:
這個功能簡直是棒極了,在調試一段代碼,並想看該代碼中最後調用方法的最終結果時就很是有用了.
開啓這個功能後,idea的Debugger會自動評估某些變量,大概就是當你執行在某個斷點時,Debugger會檢測當前調試點以前或者以後的變量的狀態,而後在變量區選擇性輸出.舉個例子來講明,未開啓該功能以前,變量區輸出全部的變量信息:
開啓以後,當你調試到第13行時,Debugger檢測到num變量在以後沒有被使用,那麼在變量區就不會輸出該變量的信息.
開啓這個功能的化,變量區中的輸出內容會按照按字母順序進行排序,很簡單,不經常使用,仍是按照默認的順序好.
這個不用說了,有任何不明白的均可以查看官方幫助文檔,這是我見到最好的文檔之一.
其餘幾個操做:Settings,Pin,Close留給各位本身去使用.
在調試過程當中,咱們能夠方便的修改某個變量的值,以下:
在上圖中,當前result的值通過計算爲10,這裏咱們經過Set Value將其計算結果修改成100.
該區域將顯示你所感興趣的變量的值。在調試模式下,你能夠經過Add to Watches將某個變量添加到觀察區,該值的變化將會在變量觀察區顯示。操做以下:
這裏咱們對name比較感興趣,但願看到它的值的變化狀況,所以咱們將其「特殊關照」。須要注意,此時由於name是成員變量,所以在對象觀察區也可看到該值。若是是局部變量,無疑只能用這種方式了。
到目前爲止,咱們已經簡單的介紹了調試功能區,斷點管理區,求值表達式,這三個區域的功能。在上面,咱們不斷的提到了斷點一次,可是斷點是什麼呢?想必大部分人已經知道了,咱們這裏在簡單的說明下:
斷點是調試器的功能之一,可讓程序暫停在須要的地方,幫助咱們進行分析程序的運行過程。
在Android Studio中,斷點又被如下五類:
其中方法斷點是咱們最熟悉的斷點類型,相信沒有人不會。下面咱們着重介紹其餘四種類型的斷點。
所謂的條件斷點就是在特定條件發生的斷點,也就是,咱們可將某個斷點設置爲只對某種事件感興趣,最典型的應用就是在列表循環中,咱們但願在某特定的元素出現時暫停程序運行。好比,如今咱們有個list中,其中包含了q,1q,2q,3q四個元素,咱們但願在遍歷到2q時暫停程序運行,那麼須要進行以下操做:
在須要的地方添加斷點,以下:
斷點處左鍵單擊,在Condition處填寫過濾條件.此處咱們只關心2q,所以填寫s.equals("2q")
該類型的斷點不會使程序停下來,而是在輸出咱們要它輸出的日誌信息,而後繼續執行。具體操做以下:
一樣在斷點處左鍵單擊,在彈出的對話框中取消選中Suspend。
在彈出的控制面板中,選中Log evaluated expression,而後再填寫想要輸出的日誌信息,以下:
當調試過程遇到該斷點將會輸出結果,以下:
所謂的異常斷點就是在調試過程當中,一旦發生異常(能夠指定某類異常),則會馬上定位到異常拋出的地方。好比在調試異常中,咱們很是關注運行時異常,但願在產生任何運行異常時及時定位,那麼此時就能夠利用該類型異常,在上線以前,進行異常斷點調試很是有利於減小正式環境中發生crash的概率。
具體操做以下:在Run菜單項中,選擇View Breakpoints(也能夠在斷點管理面板中點擊
),以下:
在管理斷點面板中,點擊+
在彈出的下拉選擇列表中,咱們選擇Java Exception Breakpoints
這裏咱們選中Search By Name,在下面的輸入框中輸入咱們所關心的異常類型。此處咱們關心NullPointerException,在調試過程一旦發生NullPointerException,調試器就會定位到異常發生處。
(略過吧,應該沒人不知道了)
Filed WatchPoint是本質上是一種特殊的斷點,也稱爲屬性斷點:當咱們某個字段值被修改的時候,程序暫停在修改處。一般在調試多線程時尤其可用,能幫咱們及時的定位併發錯誤的問題。其使用和添加普通的斷點並沒有不一樣,斷點圖標稍有不一樣
到目前,調試的相關基礎咱們已經介紹完了,可是很多童鞋對Android Studio中
這兩個按鈕感到困惑:Debug和Attach process。
這裏咱們就簡單介紹一下這二者的區別:
在具體調試過程,自行酌情選擇便可。後面,我會帶你們一步一步調試Android的Framework相關的源碼,參見:
本身動手編譯最新Android源碼及SDK及本身動手調試Android源碼