版權聲明:本文為部落客原創文章,轉載請注明出處http://blog.csdn.net/u013132758。 https://blog.csdn.net/u013132758/article/details/51915575
本文已授權微信公衆号:鴻洋(hongyangAndroid)在微信公衆号平台原創首發。
前段時間剛剛入職,還算比較幸運。進來就是讓我做Android的。好多同學都去做其他沒有接觸過的東西了。剛開始一周肯定就是熟悉代碼。但是我剛拿到代碼我就呆了。做的是一個金融業務的APP。由于好多資料要加密是以,公司自己采用TCP層連結,用SSL加密協定。自己封裝的網絡架構和網絡請求 。其中令我最頭疼的就是網絡請求的發包和回包以及回包資料的處理。在這個熟悉代碼的過程中最主要的就是調試。以前從沒用過Android
studio 的調試。下面就來簡單介紹一下Android studio的調試。
我們先來看看AS的調試面闆:
點選右上角Restore ‘Threads’View可先展示目前相關的線程資訊:
AS的調試主要分為6個功能區:
1、斷點調試功能區
2、斷點管理功能區
3、求值表達式
4、線程幀棧區
5、對象變量區
6、變量觀察區
下面我們一個一個來介紹:
1、斷點調試功能區:
這個區主要由上面這幾個按鈕:Step over、step into、force step into、step out、drop frame。
1.1:Step over
單步執行按鈕,點選這個按鈕,程式向下執行下一步,如果下一步是方法,那麼執行到這一步時這步多調用的方法已經執行完畢。
例如:
int num = 10;
int nu = MAX(num,100);
若現在在第一行,當執行Step over時,會執行完MAX這個方法裡面所有的步驟。
1.2:step into
單步跳入按鈕,點選該按鈕,程式向下執行一步,如果下一步是方法,那麼跳入到該方法的第一步。
如上面的點選step into則跳入MAX方法的第一步。
1.3 force step into
強制單步跳入,和step into功能類似,主要差別在于:如果下一行是一個方法,則不管該方法是我們自行定義還是類庫提供的,都能跳入到方法内部繼續執行。
1.4 step out
單步跳出按鈕,和step into 功能相反。主要作用是:跳出目前執行的方法或循環。
例如:上面點選step into跳入MAX方法裡面。點選該按鈕則跳出MAX方法并且執行完該方法。
1.5 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().
2.1 執行至下一斷點:
點選該按鈕,程式執行至下一斷點出。
在很多情況下,我們會設定多個斷點以便調試。在某些情況下,我們需要從目前斷點移動到下一個斷點處,兩個斷點之間的代碼自動被執行,這樣我們就不需要一步一步調試到下一個斷點了,省時又省力。
2.2 斷點管理
該按鈕的主要功能是對所有斷點進行管理(增加、删除)。點選該按鈕我們可以看到如下所示的視窗:
2.3 停止調試
這個按鈕的功能顧名思義就是停止調試,推出調試模式,這裡就不再多做說明了。
即Evaluate expression,當執行該操作時,會在目前調試的語句處嵌入一個互動式解釋器,在該解釋器中,你可以執行任何你想要執行的表達式進行求值操作。比如,我們在調試時執行到以下代碼:
此時執行Evaluate Expression,就相當于在調試行之前嵌入了一個互動式解釋器,那麼在該解釋器中我們能做什麼呢?在這裡,我們可以對result進行求值操作:對着你想要求值得位置點選滑鼠右鍵,選擇evaluate Expression.此時會顯示如下:
在彈出的輸入框中輸入求值表達式,比如這裡我們輸入Math.min(result,50),如下圖所示:
點選執行,我們發現在Result中已經輸出了結果,如下:
4、修改變量值
在調試過程中,我們可以友善的修改某個變量的值,如下:
在上圖中,目前result的值經過計算為10,這裡我們通過Set Value将其計算結果修改為100.
5、變量觀察區
該區域将顯示你所感興趣的變量的值。在調試模式下,你可以通過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
Filed WatchPoint是本質上是一種特殊的斷點,也稱為屬性斷點:當我們某個字段值被修改的時候,程式暫停在修改處。通常在調試多線程時尤為可用,能幫我們及時的定位并發錯誤的問題。其使用和添加普通的斷點并無不同,斷點圖示稍有不同調試的兩種方式。
到目前,調試的相關基礎我們已經介紹完了,但是不少童鞋對Android Studio中
這兩個按鈕感到困惑:Debug和Attach process。 這裡我們就簡單介紹一下這兩者的差別:
Debug:以調試模式安裝運作,斷點可以在運作之前設定,也可在運作後設定,是多數人最常用的調式方式
Attach process:和Debug方式相比,能夠将調試器attach到任何正在運作的程序。比如,我們可以通過attach process到想要調試的程序。然後,在需要的地方設定相關斷點即可。