編輯:關於Android編程
Android Studio目前已經成為開發Android的主要工具,用熟了可謂相當順手。作為開發者,調試並發現bug,進而解決,可是我們的看家本領。正所謂,工欲善其事必先利其器,和其他開發工具一樣,如Eclipse、Idea,Android Studio也為我們提供了強大的調試技巧,今天我們就來看看Android Studio中有關調試的技巧。
首先,來看看Android studio中為我們提供的調試面板(標准情況下):
點擊右上角Restore ‘Threads’View可先展示目前相關的線程信息:
android studio大體為我們提供了7個功能區:<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCrX3ytS5psTcx/ggts+147ncwO25psTcx/ggx/PWtbHttO/KvSDP37PM1qHVu8f4ILbUz/Ox5MG/x/ggseTBv7nbsuzH+A0KPHA+z8LD5s7Sw8e31rHwttTV4sbfuPbH+NPyvfjQ0L3pydyhozwvcD4NCjxociAvPg0KPGgxIGlkPQ=="調試功能區">調試功能區
該區提供了調試的主要操作,和你所熟知的一樣的,主要有:Step over、step into、force step into、step out、drop frame。
單步跳過,點擊該按鈕將導致程序向下執行一行。如果下一行是一個方法調用,那麼調式到這一行時,此行調用的方法已被執行完畢。比如當前代碼是:
int num=10;
int min=Math.min(num,100)
如果當前調試的是第一行,當點擊step over時,此時調試的是第2行,並且Math.min(num,100)該方法已經被執行完畢。
單步跳入,執行該操作將導致程序向下執行一行。如果下一行是自定義的方法,則進入該方法內部繼續執行,需要注意如果下一行是類庫中的方法,則不會方法內部。
強制單步跳入,和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().
即Evaluate expression,當執行該操作時,會在當前調試的語句處嵌入一個交互式解釋器,在該解釋器中,你可以執行任何你想要執行的表達式進行求值操作。比如,我們在調試時執行到以下代碼:
此時執行Evaluate Expression,就相當於在調試行之前嵌入了一個交互式解釋器,那麼在該解釋器中我們能做什麼呢?在這裡,我們可以對result進行求值操作:對著你想要求值得位置點擊鼠標右鍵,選擇evaluate Expression.此時會顯示如下:
在彈出的輸入框中輸入求值表達式,比如這裡我們輸入Math.min(result,50)
,如下圖
點擊執行,我們發現在Result中已經輸出了結果,如下:
在很多情況下,我們會設置多個斷點以便調試。在某些情況下,我們需要從當前斷點移動到下一個斷點處,兩個斷點之間的代碼自動被執行,這樣我們就不需要一步一步調試到下一個斷點了,省時又省力。舉例說明:
public void test(){
test1();
...
test2();
}
假設我們分別在第2行和第4行添加了斷點。如果此時我們調試在第2行,此時點擊執行該操作,當前調試位置會自動執行到第4行,也就是第2到第4行之間的代碼會自動被執行。
執行該操作將會進入斷點管理界面,在這裡你可以對目前已經添加的斷點進行管理,比如刪除,修改屬性信息等。如圖:
在調試過程中,我們可以方便的修改某個變量的值,如下:
在上圖中,當前result的值經過計算為10,這裡我們通過Set Value將其計算結果修改為100.
所謂的停止調試,並不是程序停止運行,而是退出調試模式。比如調試模式下設置了如下斷點:
此時如果我們執行停止操作,發現程序退出調試模式,並正常執行完畢,Console中輸出結果:
default
debug
該區域將顯示你所感興趣的變量的值。在調試模式下,你可以通過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中