AndroidStudio調試之旅

? 在平常開發中難免會寫出一些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>

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容