【轉】你所不知道的Android Studio調試技巧

這篇寫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個功能區:併發

  1. 單步調試區
  2. 斷點管理區
  3. 求值表達式
  4. 線程幀棧區
  5. 對象變量區
  6. 變量觀察區

下面咱們分別對這七個區域進行介紹。app


單步調試區

該區提供了調試的主要操做,和你所熟知的同樣的,主要有:Step over、step into、force step into、step out、drop frame。ide

Show Execution Point


這裏寫圖片描述

點擊該按鈕,光標將定位到當前正在調試的位置.工具

Step Over


這裏寫圖片描述

單步跳過,點擊該按鈕將致使程序向下執行一行。若是當前行是一個方法調用,此行調用的方法被執行完畢後再到下一行。好比當前代碼是:開發工具

int num=10; int min=Math.min(num,100); System.out.println(min);

若是當前調試的是第二行,當點擊step over時,Math.min(num,100)方法先執行完後跳到第三行.this

Step Into


這裏寫圖片描述

單步跳入,執行該操做將致使程序向下執行一行。若是該行有自定義的方法,則進入該方法內部繼續執行,須要注意若是是類庫中的方法,則不會進入方法內部。

Force Step Into


這裏寫圖片描述

強制單步跳入,和step into功能相似,主要區別在於:若是當前行有任何方法,則無論該方法是咱們自行定義仍是類庫提供的,都能跳入到方法內部繼續執行

Drop Frame


這裏寫圖片描述

沒有好記的名字,大意理解爲中斷執行,並返回到方法執行的初始點,在這個過程當中該方法對應的棧幀會從棧中移除.換言之,若是該方法是被調用的,則返回到當前方法被調用處,而且全部上下文變量的值也恢復到該方法未執行時的狀態。簡單的舉例來講明:

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().

Force Run to Cursor


這裏寫圖片描述

很是好用的一個功能,能夠忽視已經存在的斷點,跳轉到光標所在處.舉個簡單例子說明下:


這裏寫圖片描述


好比如今第10行,此時我想調試18行而又不想一步一步調試,能不能一次到位呢?咱們只須要將光標定位到相應的位置,而後執行Force Run to Cursor便可:


這裏寫圖片描述

Evaluate expression


這裏寫圖片描述

點擊該按鈕會在當前調試的語句處嵌入一個交互式解釋器,在該解釋器中,你能夠執行任何你想要執行的表達式進行求值操做。好比,咱們在調試時執行到如下代碼:


這裏寫圖片描述

此時執行Evaluate Expression,就至關於在調試行以前嵌入了一個交互式解釋器,那麼在該解釋器中咱們能作什麼呢?在這裏,咱們能夠對result進行求值操做:對着你想要求值得位置點擊鼠標右鍵,選擇evaluate Expression.此時會顯示以下:


這裏寫圖片描述

在彈出的輸入框中輸入求值表達式,好比這裏咱們輸入Math.min(result,50),以下圖


這裏寫圖片描述

點擊執行,咱們發如今Result中已經輸出告終果,以下:


這裏寫圖片描述

斷點管理區

Return


這裏寫圖片描述

點擊該按鈕會中止目前的應用,而且從新啓動.換言之,就是你想要從新調試時,可使用該操做,嗯,就是從新來過的意思.

Pause Program


這裏寫圖片描述

點擊該按鈕將暫停應用的執行.若是想要恢復則可使用下面提到的Resume Program.

Resume Program


這裏寫圖片描述

該操做有恢復應用的含義,可是卻有兩種行爲:

  1. 在應用處在暫停狀態下,點擊該按鈕將恢復應用運行.
  2. 在不少狀況下,咱們會設置多個斷點以便調試。在某些狀況下,咱們須要從當前斷點移動到下一個斷點處,兩個斷點之間的代碼自動被執行,這樣咱們就不須要一步一步調試到下一個斷點了,省時又省力。舉例說明:
public void test(){ test1(); ... test2(); }

假設咱們分別在第2行和第4行添加了斷點。若是此時咱們調試在第2行,此時點擊執行該操做,當前調試位置會自動執行到第4行,也就是第2到第4行之間的代碼會自動被執行。

Stop


這裏寫圖片描述

點擊該按鈕會經過相關的關閉腳原本終止當前進程.換言之,對不一樣類型的工程可能有不一樣的中止行爲,好比:對普通的Java項目,點擊該按鈕意味着退出調試模式,可是應用還會執行完成.而在Android項目中,點擊該按鈕,則意味這app結束運行.

這裏咱們以一個普通的JAVA工程爲例:


這裏寫圖片描述

此時若是咱們執行中止操做,發現程序退出調試模式,並正常執行完畢,Console中結果以下:


這裏寫圖片描述

View Breakpoints


這裏寫圖片描述

點擊該按鈕會進入斷點管理界面,在這裏你能夠查看全部斷點,管理或者配置斷點的行爲,如:刪除,修改屬性信息等:


這裏寫圖片描述

Mute Breakpoints


這裏寫圖片描述

使用該按鈕來切換斷點的狀態:啓動或者禁用.在調試過程當中,你能夠禁用暫時禁用全部的斷點,已實現應用正常的運行.該功能很是有用,好比當你在調試過程當中,忽然不想讓斷點干擾你所關心的流程時,能夠臨時禁用斷點.

Get thread dump


這裏寫圖片描述

獲取線程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.

這裏寫圖片描述

Settings


這裏寫圖片描述

點擊該按鈕將打開有關設置的列表:


這裏寫圖片描述

咱們對其中的幾個進行說明:

Show Values Inline

調試過程當中開啓該功能,將會代碼右邊顯示變量值,即下圖中紅框所示部分:


這裏寫圖片描述

Show Method Return Values

調試過程當中啓用該功能,將在變量區顯示最後執行方法的返回值.舉個例子來講,首先,關閉該功能,咱們調試這段代碼並觀察其變量區:


這裏寫圖片描述


開啓該功能以後,再來觀察變量區的變化:


這裏寫圖片描述

繼續往下調試:


這裏寫圖片描述

繼續往下調試:


這裏寫圖片描述

這個功能簡直是棒極了,在調試一段代碼,並想看該代碼中最後調用方法的最終結果時就很是有用了.

Auto-Variables Mode

開啓這個功能後,idea的Debugger會自動評估某些變量,大概就是當你執行在某個斷點時,Debugger會檢測當前調試點以前或者以後的變量的狀態,而後在變量區選擇性輸出.舉個例子來講明,未開啓該功能以前,變量區輸出全部的變量信息:


這裏寫圖片描述

開啓以後,當你調試到第13行時,Debugger檢測到num變量在以後沒有被使用,那麼在變量區就不會輸出該變量的信息.


這裏寫圖片描述

Sort values alphabetically

開啓這個功能的化,變量區中的輸出內容會按照按字母順序進行排序,很簡單,不經常使用,仍是按照默認的順序好.

Help


這裏寫圖片描述

這個不用說了,有任何不明白的均可以查看官方幫助文檔,這是我見到最好的文檔之一.
其餘幾個操做:Settings,Pin,Close留給各位本身去使用.


修改變量值

在調試過程當中,咱們能夠方便的修改某個變量的值,以下:


這裏寫圖片描述


在上圖中,當前result的值通過計算爲10,這裏咱們經過Set Value將其計算結果修改成100.


變量觀察區

該區域將顯示你所感興趣的變量的值。在調試模式下,你能夠經過Add to Watches將某個變量添加到觀察區,該值的變化將會在變量觀察區顯示。操做以下:


這裏寫圖片描述


這裏咱們對name比較感興趣,但願看到它的值的變化狀況,所以咱們將其「特殊關照」。須要注意,此時由於name是成員變量,所以在對象觀察區也可看到該值。若是是局部變量,無疑只能用這種方式了。


斷點的分類

到目前爲止,咱們已經簡單的介紹了調試功能區,斷點管理區,求值表達式,這三個區域的功能。在上面,咱們不斷的提到了斷點一次,可是斷點是什麼呢?想必大部分人已經知道了,咱們這裏在簡單的說明下:

斷點是調試器的功能之一,可讓程序暫停在須要的地方,幫助咱們進行分析程序的運行過程。

在Android Studio中,斷點又被如下五類:

  1. 條件斷點
  2. 日誌斷點
  3. 異常斷點
  4. 方法斷點
  5. 屬性斷點

其中方法斷點是咱們最熟悉的斷點類型,相信沒有人不會。下面咱們着重介紹其餘四種類型的斷點。

條件斷點

所謂的條件斷點就是在特定條件發生的斷點,也就是,咱們可將某個斷點設置爲只對某種事件感興趣,最典型的應用就是在列表循環中,咱們但願在某特定的元素出現時暫停程序運行。好比,如今咱們有個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


這裏寫圖片描述

Filed WatchPoint是本質上是一種特殊的斷點,也稱爲屬性斷點:當咱們某個字段值被修改的時候,程序暫停在修改處。一般在調試多線程時尤其可用,能幫咱們及時的定位併發錯誤的問題。其使用和添加普通的斷點並沒有不一樣,斷點圖標稍有不一樣


調試的兩種方式

到目前,調試的相關基礎咱們已經介紹完了,可是很多童鞋對Android Studio中


這裏寫圖片描述

這兩個按鈕感到困惑:Debug和Attach process。
這裏咱們就簡單介紹一下這二者的區別:

  • Debug:以調試模式安裝運行,斷點能夠在運行以前設置,也可在運行後設置,是多數人最經常使用的調式方式
  • Attach process:和Debug方式相比,可以將調試器attach到任何正在運行的進程。好比,咱們能夠經過attach process到想要調試的進程。而後,在須要的地方設置相關斷點便可。

在具體調試過程,自行酌情選擇便可。後面,我會帶你們一步一步調試Android的Framework相關的源碼,參見:
本身動手編譯最新Android源碼及SDK本身動手調試Android源碼



文/涅槃1992(簡書做者) 原文連接:http://www.jianshu.com/p/011eb88f4e0d# 著做權歸做者全部,轉載請聯繫做者得到受權,並標註「簡書做者」。
相關文章
相關標籤/搜索