做開發者幾年,多數的情況下是在用打log這種方式進行除錯應用:一來長期使用以來的習慣,二來是公司安裝的as,執行debug出各種錯誤,解除安裝安裝都不好使;但前一段時間需要除錯一段程式碼,通過打log的方式,費時又費力,很簡單的錯誤硬是搞了好久,嚴重影響進度,所以下心思準備再次好好搞一下debug除錯,但使用debug的方法幾乎忘得差不多了,於是週末花點時間撿起來,並做個記錄。
先來看看開啟debug的兩種方式(如下圖):
方法1:以除錯模式安裝執行,斷點在執行前後都可以設定注:執行該方法有可能會報一個錯誤(一直停留在waiting for debugger)
解決方案:
- 判斷是否開啟多個模擬器或as,全部關掉,只留下一個as和要執行的機器;
- 檢視adb埠是否被360手機助手佔用,如果有則關閉;
- 重啟adb;
- 以上方法都不好使,就換一個裝置(我的紅米3s一直進不去,結果使用模擬器除錯)
方法2:和debug方式相比,能夠將偵錯程式attach到任何正在執行的程式(沒用過,方式1就可以解決大多數問題)。
Debug介面:基本分為6個功能區
- 除錯功能區
- 斷點管理區
- 執行緒棧幀區
- 物件變數區
- 變數觀察區
- 求值表示式
功能除錯區
-
Show Execution Point:點選該按鈕,游標將定位到當前正在除錯的位置。
-
Step Over(快捷鍵F8):單步跳過,點選該按鈕將導致程式向下執行一行,如果當前行是一個方法呼叫,則獲取方法結果並執行下一行,不會進入方法內部。
-
Step Into(快捷鍵F7):單步跳入,和Step Over類似,但如果該行的方法是自定義方法,則進入方法內部執行,如果是類庫中的方法,則不會進入。
-
Force Step Info:強制單步跳入,和Step Info類似,區別在於會進入方法的內部,不管該方法是自定義或類庫中方法。
-
Drop Frame:中斷執行,並返回到方法執行的初始點,在這個過程中該方法對應的幀棧會從棧中移除,例如如果是方法被呼叫 則返回該方法被呼叫處,且所有上下文變數的值也恢復到執行時的狀態。
-
Force Run to Cursor:忽略所有的斷點,跳轉到當前游標所在的位置進行除錯,在游標之前的斷點都被忽略。
-
Evaluate expression:點選該按鈕會在當前除錯的語句處嵌入一個互動式直譯器,在該直譯器中,可執行表示式進行求值操作。
斷點管理區
-
Return:點選該按鈕會停止當前應用並重新啟動(不知道為什麼我的as上沒有這個按鈕)。
-
Resume Program(快捷鍵F9):跳轉到下一個斷點處,如果沒有斷點則執行停止。
-
Stop:停止除錯,結束執行。
-
View BreakPoints(Run --> View BreakPoints):該按鈕用來禁止/啟動所有斷點。
變數觀察區(用於觀察某個變數的值)
-
新增到觀察區:
-
設定變數的值:選中變數,右鍵選中set Value,彈出輸入框,修改變數值後回車即可:
執行緒幀棧區:用於檢視執行緒執行狀態
斷點的分類
-
條件斷點:
-
日誌斷點:右鍵斷點,勾選Log message to console 和 Evluate and log,可以在斷點上設定日誌,並在控制檯輸出。
-
異常斷點:在執行到異常時,控制異常程式停止到丟擲異常那一刻。
-
方法斷點:可以通過單步除錯,檢視方法的引數和返回值。
- 屬性斷點:通過新增到watches,檢視每次屬性的變化,如同觀察變數區。