首頁>技術>

debug 是日常開發中非常重要的技能,並不僅限於單步除錯這些簡單的使用,其實對於一些第三方 aar甚至系統原始碼,還支援執行中不阻塞再不修改這些原始碼的基礎上打日誌等非常多的技巧。

而且這屬於一個實用且可以長期使用的技能,付出一點時間,長期的收益是非常明顯的。

目錄

Debug斷點跟蹤除錯是開發過程中分析程式碼、解決BUG的一個重要手段,很多程式設計師的除錯水平往往停留在單步執行階段,因為單步執行往往就可以解決大部分的問題。但是一個優秀的程式設計師不僅僅要解決問題,還要高效地解決問題,本文將介紹一些非常方便的除錯技巧。

基本使用

Debug App有兩種途徑:

第二種就是除錯當前已經處於執行狀態下的App,點選執行按鈕右側第五個按鈕,彈出Choose Process視窗,選擇對應的程序,點選OK按鈕即可進入除錯模式,此時,我們便可以在需要的地方直接下斷點除錯程式碼了

接下來就是常見的除錯方法了,在Debug視窗頂部工具欄有一排操作按鈕,比如Step Over(單步執行)、Step Into(進入方法)等,如圖所示:

打斷點和取消斷點最直接的方式就是單擊目的碼行的行號右側空白處,然後在Debug視窗左側有個斷點瀏覽按鈕View Breakpoints,位於停止按鈕下方第一個,可以瀏覽Project中的所有斷點,同時可以新增刪除斷點

條件斷點

有時候,我們的斷點打在了迴圈體裡面,但是我們只想看某一特定迴圈次數下的執行情況,難道要不停地跳至下一次斷點直至滿足我們的要求嗎?

條件斷點可以自己輸入條件,比如for迴圈中輸入i == 5即可讓程式直接執行至第六次迴圈

日誌斷點

列印日誌也是跟蹤程式分析問題的一個非常有效的手段,但是如果我們的程式已經執行並且處於除錯模式,此時如果想列印日誌來分析程式碼,難道還要停止除錯、新增Log程式碼並重新編譯執行嗎?

如果使用日誌斷點,就不用這麼繁瑣了。右鍵點選斷點,在彈出的視窗中取消勾選Suspeng複選框(即表示程式執行至此斷點時不會停下來供開發者除錯),然後勾選Evaluate and log,並輸入列印語句即可。這樣,當Debug模式下的程式執行至此,不會停下來,而是在控制檯中列印對應資訊

變數賦值

比如,我們的程式碼裡有一個變數,這個變數的值會影響到程式的執行結果。如果我們想觀察這個變數在不同的賦值下程式的執行結果怎麼辦呢?

難道要一遍遍的在程式碼裡修改變數值,然後重新執行程式嗎?

顯然這是非常麻煩的操作。如果利用Debug模式下的變數賦值(Set Value),只需要執行一次,就能達到我們的觀察效果。

在使用該變數的程式碼處打個斷點,然後在Variables視窗找到對應的變數,修改變數值並執行即可。

如這裡我們可以把b的值改為false,那麼Toast輸出的值就是Hi

變數觀察

在Variables變數區和Watches觀察區可以檢視Debug模式下,程式執行到斷點處的變數值或者物件的各屬性值,如果程式比較複雜變數很多看起來就有點不方便。

那麼就可以通過彈出視窗的形式檢視屬性值,只要將游標定位至斷點程式碼行所用到的變數,IDE會自動彈出一個小視窗,如下圖所示,此時,使用對應的快捷鍵或者點選這個小窗口裡的變數即可彈出變數屬性值視窗,Mac下的快捷鍵位command + F1,如圖所示:

我們也可以使用New watch,方便我們更快定位到需要觀察的變數

物件求值

在斷點處,如果有變數物件,系統提供了表示式求值功能,針對Variables檢視中的變數物件,我們可以輸入任何計算語句,實時查看錶達式計算結果。

具體操作為,右鍵Variables檢視中的變數物件,選擇Evaluate Expression,彈出表示式視窗,輸入任何你想要的計算語句,點選Evaluate計算按鈕,即可顯示計算結果

方法斷點

當我們想要觀察某個方法的呼叫時機,可以使用方法斷點

這裡有一個小建議,我們可以在寫一個方法的時候,在方法註釋中列出方法入參,這樣一方面是可以給入參增加一些註釋,同時在打斷點的時候,也能非常直觀的看到方法入參的值

變數斷點

有時候,我們想知道自定義的變數的何時何地發生了改變,就可以使用變數斷點。在變數定義行打斷點,開啟Debug模式,在程式執行的過程中,如果該變數的值發生改變,程式會自動停下來,並定位在改變變數值的地方。這裡要注意的是,對於引用資料型別,通過set方法改變內部的值並不會觸發變數斷點,只有引用的地址發生改變才會觸發

異常斷點

程式在執行的過程中可能會出現各種各樣的未知性異常,如果能在發生異常的時候第一時間讓程式停下來,並定位到異常出現的地方,而不是讓應用直接崩潰,那樣有時候能幫助我們更方便定位問題

開啟斷點管理器,點選工具欄選單Run,選擇View Breakpoints;在Debug視窗直接點選View Breakpoints圖示。點選左上角加號按鈕,可以新增各種斷點,包括前文提到的Method Breakpoints和Field Watchpoints斷點,這裡我們選擇Exception Breakpoints異常斷點,在彈出的Enter Exception Class視窗中輸入需要監控的異常類別即可

這樣當我們執行下面的程式碼,IDE會自動幫我們定位到問題發生的位置

總結

debug是非常非常基礎的技術,所謂磨刀不誤砍柴工,掌握一些小技巧,往往能幫我們更高效的解決一些問題。

本文拋磚引玉,希望大家在開發過程中多留心一些很基礎的技術,有時候了解一些你認為很不起眼的知識點,能夠幫助你解決一些很棘手的問題。

但是,在多執行緒環境下,光靠 debug 是不夠的。有時 debug 本身會帶來一些問題混淆了現場,比如因為 debug 時的卡頓造成環境不一致等等,這時應該學會使用打日誌的形式幫忙除錯,平時打日誌的時候也應該多注意一些規範,這樣能更方便排查問題。


在這我也分享一份自己收錄整理的Android學習PDF+架構視訊+面試文件+原始碼筆記,還有高階架構技術進階腦圖、Android開發面試專題資料,高階進階架構資料這些都是我閒暇還會反覆翻閱的精品資料。在腦圖中,每個知識點專題都配有相對應的實戰專案,可以有效的幫助大家掌握知識點。

總之也是在這裡幫助大家學習提升進階,也節省大家在網上搜索資料的時間來學習,也可以分享給身邊好友一起學習

如果你有需要的話,可以點贊+評論+轉發,關注我,然後私信我【進階】我發給你

最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 從上帝視角看Android JetPack