我真是服了!AS Debug還能這麼玩?

yilian發表於2020-02-10
我真是服了!AS Debug還能這麼玩?

目錄

image
image

前言

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

基本使用


Debug App有兩種途徑:

第一種是直接點選下圖執行按鈕右側的小蟲狀圖示,執行並除錯當前Project

我真是服了!AS Debug還能這麼玩?

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

我真是服了!AS Debug還能這麼玩?

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

我真是服了!AS Debug還能這麼玩?

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

我真是服了!AS Debug還能這麼玩?

條件斷點


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

我真是服了!AS Debug還能這麼玩?

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

我真是服了!AS Debug還能這麼玩?

日誌斷點


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

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

我真是服了!AS Debug還能這麼玩?
我真是服了!AS Debug還能這麼玩?

變數賦值


比如,我們的程式碼裡有一個變數,這個變數的值會影響到程式的執行結果。如果我們想觀察這個變數在不同的賦值下程式的執行結果怎麼辦呢?難道要一遍遍的在程式碼裡修改變數值,然後重新執行程式嗎?顯然這是非常麻煩的操作。如果利用Debug模式下的變數賦值( Set Value),只需要執行一次,就能達到我們的觀察效果。在使用該變數的程式碼處打個斷點,然後在 Variables視窗找到對應的變數,修改變數值並執行即可

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

我真是服了!AS Debug還能這麼玩?
我真是服了!AS Debug還能這麼玩?

變數觀察


Variables變數區和 Watches觀察區可以檢視Debug模式下,程式執行到斷點處的變數值或者物件的各屬性值,如果程式比較複雜變數很多看起來就有點不方便。那麼就可以透過彈出視窗的形式檢視屬性值,只要將游標定位至斷點程式碼行所用到的變數,IDE會自動彈出一個小視窗,如下圖所示,此時,使用對應的快捷鍵或者點選這個小視窗裡的變數即可彈出變數屬性值視窗,Mac下的快捷鍵位 command + F1,如圖所示:

我真是服了!AS Debug還能這麼玩?

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

我真是服了!AS Debug還能這麼玩?

物件求值


在斷點處,如果有變數物件,系統提供了表示式求值功能,針對 Variables檢視中的變數物件,我們可以輸入任何計算語句,實時檢視錶達式計算結果。具體操作為,右鍵 Variables檢視中的變數物件,選擇 Evaluate Expression,彈出表示式視窗,輸入任何你想要的計算語句,點選 Evaluate計算按鈕,即可顯示計算結果

我真是服了!AS Debug還能這麼玩?

方法斷點


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

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

我真是服了!AS Debug還能這麼玩?

變數斷點


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

我真是服了!AS Debug還能這麼玩?
我真是服了!AS Debug還能這麼玩?

異常斷點


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

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

我真是服了!AS Debug還能這麼玩?
我真是服了!AS Debug還能這麼玩?

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

image
image

總結

debug是非常非常基礎的技術,所謂磨刀不誤砍柴工,掌握一些小技巧,往往能幫我們更高效的解決一些問題。本文拋磚引玉,希望大家在開發過程中多留心一些很基礎的技術,有時候瞭解一些你認為很不起眼的知識點,能夠幫助你解決一些很棘手的問題

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

Android 發展至今,競爭日趨激烈,衝擊更高的職位,才有更高的收入!而我們Android程式設計師,要學的東西有很多,要想不被環境淘汰就只有不斷提升自己,從來都是我們去適應環境,而不是環境來適應我們!

附上我的Android核心技術學習大綱,獲取相關內容來我的GitHub一起玩耍:
vx:xx13414521

我真是服了!AS Debug還能這麼玩?


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69952849/viewspace-2675047/,如需轉載,請註明出處,否則將追究法律責任。

相關文章