AS之Debug除錯

阿壯發表於2018-08-19

做開發者幾年,多數的情況下是在用打log這種方式進行除錯應用:一來長期使用以來的習慣,二來是公司安裝的as,執行debug出各種錯誤,解除安裝安裝都不好使;但前一段時間需要除錯一段程式碼,通過打log的方式,費時又費力,很簡單的錯誤硬是搞了好久,嚴重影響進度,所以下心思準備再次好好搞一下debug除錯,但使用debug的方法幾乎忘得差不多了,於是週末花點時間撿起來,並做個記錄。

先來看看開啟debug的兩種方式(如下圖):

AS之Debug除錯
方法1:以除錯模式安裝執行,斷點在執行前後都可以設定

注:執行該方法有可能會報一個錯誤(一直停留在waiting for debugger

解決方案:

  • 判斷是否開啟多個模擬器或as,全部關掉,只留下一個as和要執行的機器;
  • 檢視adb埠是否被360手機助手佔用,如果有則關閉;
  • 重啟adb;
  • 以上方法都不好使,就換一個裝置(我的紅米3s一直進不去,結果使用模擬器除錯)

方法2:和debug方式相比,能夠將偵錯程式attach到任何正在執行的程式(沒用過,方式1就可以解決大多數問題)。

Debug介面:基本分為6個功能區

  • 除錯功能區
  • 斷點管理區
  • 執行緒棧幀區
  • 物件變數區
  • 變數觀察區
  • 求值表示式
    AS之Debug除錯

功能除錯區

  • Show Execution Point:點選該按鈕,游標將定位到當前正在除錯的位置。

    AS之Debug除錯

  • Step Over(快捷鍵F8):單步跳過,點選該按鈕將導致程式向下執行一行,如果當前行是一個方法呼叫,則獲取方法結果並執行下一行,不會進入方法內部。

    AS之Debug除錯

  • Step Into(快捷鍵F7):單步跳入,和Step Over類似,但如果該行的方法是自定義方法,則進入方法內部執行,如果是類庫中的方法,則不會進入。

    AS之Debug除錯

  • Force Step Info:強制單步跳入,和Step Info類似,區別在於會進入方法的內部,不管該方法是自定義或類庫中方法。

    AS之Debug除錯

  • Drop Frame:中斷執行,並返回到方法執行的初始點,在這個過程中該方法對應的幀棧會從棧中移除,例如如果是方法被呼叫 則返回該方法被呼叫處,且所有上下文變數的值也恢復到執行時的狀態。

    AS之Debug除錯

  • Force Run to Cursor:忽略所有的斷點,跳轉到當前游標所在的位置進行除錯,在游標之前的斷點都被忽略。

    AS之Debug除錯

  • Evaluate expression:點選該按鈕會在當前除錯的語句處嵌入一個互動式直譯器,在該直譯器中,可執行表示式進行求值操作。

    AS之Debug除錯

斷點管理區

AS之Debug除錯

  • Return:點選該按鈕會停止當前應用並重新啟動(不知道為什麼我的as上沒有這個按鈕)。

    AS之Debug除錯

  • Resume Program(快捷鍵F9):跳轉到下一個斷點處,如果沒有斷點則執行停止。

    AS之Debug除錯

  • Stop:停止除錯,結束執行。

    AS之Debug除錯

  • View BreakPoints(Run --> View BreakPoints):該按鈕用來禁止/啟動所有斷點。

    AS之Debug除錯
    AS之Debug除錯

變數觀察區(用於觀察某個變數的值)

AS之Debug除錯

  • 新增到觀察區:

    AS之Debug除錯

  • 設定變數的值:選中變數,右鍵選中set Value,彈出輸入框,修改變數值後回車即可:

    AS之Debug除錯
    AS之Debug除錯

執行緒幀棧區:用於檢視執行緒執行狀態

AS之Debug除錯

斷點的分類

  • 條件斷點:

    AS之Debug除錯

  • 日誌斷點:右鍵斷點,勾選Log message to console 和 Evluate and log,可以在斷點上設定日誌,並在控制檯輸出。

    AS之Debug除錯
    AS之Debug除錯

  • 異常斷點:在執行到異常時,控制異常程式停止到丟擲異常那一刻。

    AS之Debug除錯
    AS之Debug除錯

  • 方法斷點:可以通過單步除錯,檢視方法的引數和返回值。

AS之Debug除錯

  • 屬性斷點:通過新增到watches,檢視每次屬性的變化,如同觀察變數區。

相關文章