? 在平常開發中難免會寫出一些bug,明顯的bug通過分析代碼可以找出來問題所在,但也會有一些隱藏很深的bug,單憑肉眼分析代碼很難定位,這個時候就需要編譯器協助,AndroidStudio就提供了非常強大的調試功能,幫助我們能快速定位解決bug,告別加班?。。?/p>
開啟調試模式
? 首先了解下開啟調試的方法,在AndroidStudio中開啟調試模式有兩種方法,即普通Debug和Attach debugger to Android process,Debug模式大家可能經常用到,感受應該都是比較慢,特別大工程,等待時間就更長了,而另一種相對來說就快很多。
? 針對Attach debugger 模式開啟時會有提示選項 如下圖:
Auto
? 如果希望 Android Studio 自動為您要調試的代碼選擇最合適的選項,請選擇此類型。例如,如果您的項目包含任何 C 或 C++ 代碼,Android Studio 會自動使用 Hybrid 調試類型。否則,Android Studio 會使用 Java 調試類型。
Java
? 如果您只想調試以 Java 編寫的代碼,請選擇此類型 - Java 調試程序會忽略您在原生代碼中設置的任何斷點或監視。
在早期AndroidStudio 還有如下選項,本人用的AS3.0目前只有Auto/Java
Native
? 如果您只想使用 LLDB 來調試代碼,請選擇此類型。使用此調試類型時,Java 調試程序會話視圖不可用。默認情況下,LLDB 只檢查您的原生代碼,而會忽略 Java 代碼中的斷點。如果您也想調試 Java 代碼,則應切換到 Auto 或 Hybrid 調試類型。
Hybrid
? 如果您想在調試 Java 代碼與調試原生代碼之間切換,請選擇此類型。Android Studio 會將 Java 調試程序和 LLDB 都連接到您的應用進程,一個用于 Java 調試程序,一個用于 LLDB,這樣一來,您不必重新啟動應用或更改調試配置,便可同時對 Java 代碼和原生代碼中的斷點進行檢查
調試區域介紹
? 接下來了解下調試功能面板(以下就是整個調試區域圖)
功能鍵 | 名稱 | 功能描述 |
---|---|---|
Rerun Android Debugger | 重新恢復調試模式。 | |
Resume Program | 一直運行程序直到碰到下一個斷點。 | |
Pause Program | 暫停程序,等待下一步操作。 | |
Stop | 停止當前調試。 | |
View Breakpoints | 查看你設置過的所有斷點并可以設置斷點的一些屬性。 | |
Mute Breakpoints | 啟用/禁用所有斷點。 | |
Show Execution Points | 具體功能還待發掘 | |
Step Over | 程序向下執行一行,如果當前行有方法調用,這個方法執行完畢返回,然后到下一行。 | |
Step Into | 程序向下執行一行,如果當前行有用戶自定義方法(非官方類庫方法)調用,則進入該方法。 | |
Force Step Into | 程序向下執行一行,如果當前行有方法調用,則進入該方法。 | |
Step Out | 如果在調試的時候你進入了一個方法,并覺得該方法沒有問題,你就可以使用step out跳出該方法,返回到該方法被調用處的下一行語句。值得注意的是,該方法已執行完畢。 | |
Run to Cursor | 一直運行到光標所在的位置。 | |
Evaluate Expression | 通過它可以查看當前類中所有的變量的值,并且可以計算表達式的值,甚至可以運行某個函數,得到結果。 | |
New Watch | 添加觀察屬性,調試時能方便觀察該屬性變化。 |
斷點類型
左側斷點類型介紹
? Java Line Breakpoints 執行到當前行觸發此斷點
? Java Method Breakpoints 斷點位置與方法名同行,愈加方便的觀察參數和返回值
? Java Field Watchpoints 斷點位于某個字段屬性聲明位置,當字段被重新賦值時觸發斷點
? Java Exception Breakpoints 當拋出某個異常時,自動觸發
? Exception/Symbolic Breakpoints 未知
右側功能區介紹
? Enable 斷點是否可用
? Suspend 執行到斷點時,程序是否暫停
? Condition 執行此斷點條件
? Log message to console 執行到此斷點時,打印一行日志
? Evaluate log 執行到此斷點時,打印一樣的自定義日志,可以包含程序中的變量或表達式
? Remove once hit 斷點觸發后移除
高級調試應用
? 很多時候簡單的調試對于復雜的邏輯定位比較困難,有時可能需要反復嘗試才能找出問題所在。特別對于一些代碼量龐大的類,如果普通調試時要跟蹤某個變量的變化是比較費時的,還有一些對于網絡請求場景,如果要修改傳遞異常的參數,只能手動改代碼,然后重新開始調試,可以說相當麻煩。然后AndroidStudio已經提供了強大的調試功能,可以很方便在調試過程中實時跟蹤變量值變化或修改,以及表達式操作,日志輸入等。
?
增加觀察變量
動態修改變量值
? 舉個例子:對于方法test2中 ,只有當for循環里面條件滿足 field1 == 3時才會給field1賦值并調用test3方法,此種場景中,如果當i < 100甚至 i< 1000,field1 == 90時,跟蹤執行無疑會非常費時,但可以用更簡單的方法實現,模擬滿足這一條件,就是調試過程中改變field1成任意我們想要的值,怎么做呢?
?
很簡單,點擊此變量,鼠標右鍵Set Value或F2,然后就可以設置成任意我們想要的值就可以了。
條件斷點
? 當執行到某一斷點時,常規流程時,執行此斷點,但由于某原因并不想立刻執行斷點時,就可以使用條件斷點,設置此斷點執行條件,滿足條件后再執行。
? 設置斷點條件后,只有當field1變量滿足field1 == 3 時該斷點才會執行,并打印日志,此過程并不阻礙代碼執行。
? 可以看到,當滿足斷點執行條件后才執行,并打印了斷點日志,對于此種情況大家可以舉一反三,相信實際開發中能很大程度上提高調試效率。
異常斷點應用
? 程序崩潰應該是所有程序員最深惡痛絕的吧,在我這明明是正常的,到你那怎么會崩潰呢?對于明顯的崩潰情況都能快速定位出來,而對于隱藏較深的崩潰情況,可能還一時半會找不出原因所在,無法快速定位怎么辦呢?是時候嘗試下異常斷點了,這種無需手動打斷點,只需開啟調試模式并在斷點視圖上選中Java Exception Breakpoints,然后執行,慢慢等待Bug露出原形了。
開啟異常斷點
執行程序,跟蹤結果
? 可以看到,整個過程并沒有打任何斷點,設置了異常斷點后,發生Exception時自動定位代碼行,并正常輸出日志,是不是相當方便、快捷。
? 本文介紹內容對于AndroidStudio強大的調試功能,只是冰山一角,希望對大家有或多或少的幫助,減少Bug是我們的宗旨,遠離加班是我們的理想。以后發現更好玩的調試功能繼續完善?。。?/p>