天天看點

AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

Android Studio目前已經成為開發Android的主要工具,用熟了可謂相當順手。作為開發者,調試并發現bug,進而解決,可是我們的看家本領。正所謂,工欲善其事必先利其器,和其他開發工具一樣,如Eclipse、Idea,Android Studio也為我們提供了強大的調試技巧,今天我們就來看看Android Studio中有關調試的技巧。

首先,來看看Android studio中為我們提供的調試面闆(标準情況下): 

AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

點選右上角Restore ‘Threads’View可先展示目前相關的線程資訊: 

AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

android studio大體為我們提供了7個功能區:

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

下面我們分别對這七個區域進行介紹。

單步調試區

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

Show Execution Point
AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

點選該按鈕,光标将定位到目前正在調試的位置.

Step Over
AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

單步跳過,點選該按鈕将導緻程式向下執行一行。如果目前行是一個方法調用,此行調用的方法被執行完畢後再到下一行。比如目前代碼是:

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

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

Step Into
AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

單步跳入,執行該操作将導緻程式向下執行一行。如果該行有自定義的方法,則進入該方法内部繼續執行,需要注意如果是類庫中的方法,則不會進入方法内部。

Force Step Into
AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

強制單步跳入,和step into功能類似,主要差別在于:如果目前行有任何方法,則不管該方法是我們自行定義還是類庫提供的,都能跳入到方法内部繼續執行

Drop Frame
AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

沒有好記的名字,大意了解為中斷執行,并傳回到方法執行的初始點,在這個過程中該方法對應的棧幀會從棧中移除.換言之,如果該方法是被調用的,則傳回到目前方法被調用處,并且所有上下文變量的值也恢複到該方法未執行時的狀态。簡單的舉例來說明:

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 
AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

非常好用的一個功能,可以忽視已經存在的斷點,跳轉到光标所在處.舉個簡單例子說明下: 

AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

比如現在第10行,此時我想調試18行而又不想一步一步調試,能不能一次到位呢?我們隻需要将光标定位到相應的位置,然後執行Force Run to Cursor即可: 

AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

Evaluate expression
AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

點選該按鈕會在目前調試的語句處嵌入一個互動式解釋器,在該解釋器中,你可以執行任何你想要執行的表達式進行求值操作。比如,我們在調試時執行到以下代碼: 

AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

此時執行Evaluate Expression,就相當于在調試行之前嵌入了一個互動式解釋器,那麼在該解釋器中我們能做什麼呢?在這裡,我們可以對result進行求值操作:對着你想要求值得位置點選滑鼠右鍵,選擇evaluate Expression.此時會顯示如下: 

AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

在彈出的輸入框中輸入求值表達式,比如這裡我們輸入

Math.min(result,50)

,如下圖 

AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

點選執行,我們發現在Result中已經輸出了結果,如下: 

AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

斷點管理區

Return
AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

點選該按鈕會停止目前的應用,并且重新啟動.換言之,就是你想要重新調試時,可以使用該操作,嗯,就是重新來過的意思.

Pause Program
AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

點選該按鈕将暫停應用的執行.如果想要恢複則可以使用下面提到的Resume Program.

Resume Program
AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

該操作有恢複應用的含義,但是卻有兩種行為: 

1. 在應用處在暫停狀态下,點選該按鈕将恢複應用運作. 

2. 在很多情況下,我們會設定多個斷點以便調試。在某些情況下,我們需要從目前斷點移動到下一個斷點處,兩個斷點之間的代碼自動被執行,這樣我們就不需要一步一步調試到下一個斷點了,省時又省力。舉例說明:

public void test(){
    test1();
    ...
    test2();
 
}
           

假設我們分别在第2行和第4行添加了斷點。如果此時我們調試在第2行,此時點選執行該操作,目前調試位置會自動執行到第4行,也就是第2到第4行之間的代碼會自動被執行。

Stop
AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

點選該按鈕會通過相關的關閉腳本來終止目前程序.換言之,對不同類型的工程可能有不同的停止行為,比如:對普通的Java項目,點選該按鈕意味着退出調試模式,但是應用還會執行完成.而在Android項目中,點選該按鈕,則意味這app結束運作.

這裡我們以一個普通的JAVA工程為例: 

AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

此時如果我們執行停止操作,發現程式退出調試模式,并正常執行完畢,Console中結果如下: 

AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

View Breakpoints
AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

點選該按鈕會進入斷點管理界面,在這裡你可以檢視所有斷點,管理或者配置斷點的行為,如:删除,修改屬性資訊等: 

AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

Mute Breakpoints
AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

使用該按鈕來切換斷點的狀态:啟動或者禁用.在調試過程中,你可以禁用暫時禁用所有的斷點,已實作應用正常的運作.該功能非常有用,比如當你在調試過程中,突然不想讓斷點幹擾你所關心的流程時,可以臨時禁用斷點.

Get thread dump
AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

擷取線程Dump,點選該按鈕将進入線程Dump界面: 

AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

借此我們順便介紹一下dump界面: 

線程工具區中最常用的是

AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

,可以用來過濾線程,其他的不做解釋了

解析來我們來認識一下線程的類型,表示為不同的圖示:

線程狀态描述 圖示
Thread is suspended.
AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式
Thread is waiting on a monitor lock.
AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式
Thread is running.
AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式
Thread is executing network operation, and is waiting for data to be passed.
AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式
Thread is idle.
AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式
Event Dispatch Thread that is busy.
AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式
Thread is executing disk operation.
AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

Settings
AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

點選該按鈕将打開有關設定的清單: 

AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

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

Show Values Inline

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

AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

Show Method Return Values

調試過程中啟用該功能,将在變量區顯示最後執行方法的傳回值.舉個例子來說,首先,關閉該功能,我們調試這段代碼并觀察其變量區: 

AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

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

AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

繼續往下調試: 

AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

繼續往下調試: 

AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

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

Auto-Variables Mode

開啟這個功能後,idea的Debugger會自動評估某些變量,大概就是當你執行在某個斷點時,Debugger會檢測目前調試點之前或者之後的變量的狀态,然後在變量區選擇性輸出.舉個例子來說明,未開啟該功能之前,變量區輸出所有的變量資訊: 

AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

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

AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

Sort values alphabetically

開啟這個功能的化,變量區中的輸出内容會按照按字母順序進行排序,很簡單,不常用,還是按照預設的順序好.

Help
AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

這個不用說了,有任何不明白的都可以檢視官方幫助文檔,這是我見到最好的文檔之一. 

其他幾個操作:Settings,Pin,Close留給各位自己去使用.

修改變量值

在調試過程中,我們可以友善的修改某個變量的值,如下: 

AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

在上圖中,目前result的值經過計算為10,這裡我們通過Set Value将其計算結果修改為100.

變量觀察區

該區域将顯示你所感興趣的變量的值。在調試模式下,你可以通過Add to Watches将某個變量添加到觀察區,該值的變化将會在變量觀察區顯示。操作如下: 

AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

這裡我們對name比較感興趣,希望看到它的值的變化情況,是以我們将其“特殊關照”。需要注意,此時因為name是成員變量,是以在對象觀察區也可看到該值。如果是局部變量,無疑隻能用這種方式了。

斷點的分類

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

斷點是調試器的功能之一,可以讓程式暫停在需要的地方,幫助我們進行分析程式的運作過程。

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

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

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

條件斷點

所謂的條件斷點就是在特定條件發生的斷點,也就是,我們可将某個斷點設定為隻對某種事件感興趣,最典型的應用就是在清單循環中,我們希望在某特定的元素出現時暫停程式運作。比如,現在我們有個list中,其中包含了q,1q,2q,3q四個元素,我們希望在周遊到2q時暫停程式運作,那麼需要進行如下操作: 

在需要的地方添加斷點,如下: 

AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

斷點處左鍵單擊,在Condition處填寫過濾條件.此處我們隻關心2q,是以填寫

s.equals("2q")

AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

日志斷點

該類型的斷點不會使程式停下來,而是在輸出我們要它輸出的日志資訊,然後繼續執行。具體操作如下: 

同樣在斷點處左鍵單擊,在彈出的對話框中取消選中Suspend。 

AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

在彈出的控制台中,選中Log evaluated expression,然後再填寫想要輸出的日志資訊,如下: 

AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

當調試過程遇到該斷點将會輸出結果,如下: 

AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

異常斷點

所謂的異常斷點就是在調試過程中,一旦發生異常(可以指定某類異常),則會立刻定位到異常抛出的地方。比如在調試異常中,我們非常關注運作時異常,希望在産生任何運作異常時及時定位,那麼此時就可以利用該類型異常,在上線之前,進行異常斷點調試非常有利于減少正式環境中發生crash的幾率。 

具體操作如下:在Run菜單項中,選擇View Breakpoints(也可以在斷點管理面闆中點選

AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

),如下: 

AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

在管理斷點面闆中,點選+ 

AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

在彈出的下拉選擇清單中,我們選擇Java Exception Breakpoints 

AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

這裡我們選中Search By Name,在下面的輸入框中輸入我們所關心的異常類型。此處我們關心NullPointerException,在調試過程一旦發生NullPointerException,調試器就會定位到異常發生處。 

AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

方法斷點
AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

(略過吧,應該沒人不知道了)

Filed WatchPoint
AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

Filed WatchPoint是本質上是一種特殊的斷點,也稱為屬性斷點:當我們某個字段值被修改的時候,程式暫停在修改處。通常在調試多線程時尤為可用,能幫我們及時的定位并發錯誤的問題。其使用和添加普通的斷點并無不同,斷點圖示稍有不同

調試的兩種方式

到目前,調試的相關基礎我們已經介紹完了,但是不少童鞋對Android Studio中

AndroidStudio Debug調試使用單步調試區斷點管理區修改變量值變量觀察區斷點的分類調試的兩種方式

這兩個按鈕感到困惑:Debug和Attach process。 

這裡我們就簡單介紹一下這兩者的差別:

  • Debug:以調試模式安裝運作,斷點可以在運作之前設定,也可在運作後設定,是多數人最常用的調式方式
  • Attach process:和Debug方式相比,能夠将調試器attach到任何正在運作的程序。比如,我們可以通過attach process到想要調試的程序。然後,在需要的地方設定相關斷點即可。