如需轉(zhuǎn)載請(qǐng)?jiān)u論或簡(jiǎn)信,并注明出處,未經(jīng)允許不得轉(zhuǎn)載

目錄

前言
Debug斷點(diǎn)跟蹤調(diào)試是開(kāi)發(fā)過(guò)程中分析代碼、解決BUG的一個(gè)重要手段,很多程序員的調(diào)試水平往往停留在單步執(zhí)行階段,因?yàn)閱尾綀?zhí)行往往就可以解決大部分的問(wèn)題。但是一個(gè)優(yōu)秀的程序員不僅僅要解決問(wèn)題,還要高效地解決問(wèn)題,本文將介紹一些非常方便的調(diào)試技巧
基本使用
Debug App有兩種途徑:
第一種是直接點(diǎn)擊下圖運(yùn)行按鈕右側(cè)的小蟲(chóng)狀圖標(biāo),運(yùn)行并調(diào)試當(dāng)前Project

第二種就是調(diào)試當(dāng)前已經(jīng)處于運(yùn)行狀態(tài)下的App,點(diǎn)擊運(yùn)行按鈕右側(cè)第五個(gè)按鈕,彈出Choose Process窗口,選擇對(duì)應(yīng)的進(jìn)程,點(diǎn)擊OK按鈕即可進(jìn)入調(diào)試模式,此時(shí),我們便可以在需要的地方直接下斷點(diǎn)調(diào)試代碼了

接下來(lái)就是常見(jiàn)的調(diào)試方法了,在Debug窗口頂部工具欄有一排操作按鈕,比如Step Over(單步執(zhí)行)、Step Into(進(jìn)入方法)等,如圖所示:

打斷點(diǎn)和取消斷點(diǎn)最直接的方式就是單擊目標(biāo)代碼行的行號(hào)右側(cè)空白處,然后在Debug窗口左側(cè)有個(gè)斷點(diǎn)瀏覽按鈕View Breakpoints,位于停止按鈕下方第一個(gè),可以瀏覽Project中的所有斷點(diǎn),同時(shí)可以添加刪除斷點(diǎn)

條件斷點(diǎn)
有時(shí)候,我們的斷點(diǎn)打在了循環(huán)體里面,但是我們只想看某一特定循環(huán)次數(shù)下的運(yùn)行情況,難道要不停地跳至下一次斷點(diǎn)直至滿足我們的要求嗎?

條件斷點(diǎn)可以自己輸入條件,比如for循環(huán)中輸入i == 5即可讓程序直接運(yùn)行至第六次循環(huán)

日志斷點(diǎn)
打印日志也是跟蹤程序分析問(wèn)題的一個(gè)非常有效的手段,但是如果我們的程序已經(jīng)運(yùn)行并且處于調(diào)試模式,此時(shí)如果想打印日志來(lái)分析代碼,難道還要停止調(diào)試、添加Log代碼并重新編譯運(yùn)行嗎?
如果使用日志斷點(diǎn),就不用這么繁瑣了。右鍵點(diǎn)擊斷點(diǎn),在彈出的窗口中取消勾選Suspeng復(fù)選框(即表示程序運(yùn)行至此斷點(diǎn)時(shí)不會(huì)停下來(lái)供開(kāi)發(fā)者調(diào)試),然后勾選Evaluate and log,并輸入打印語(yǔ)句即可。這樣,當(dāng)Debug模式下的程序執(zhí)行至此,不會(huì)停下來(lái),而是在控制臺(tái)中打印對(duì)應(yīng)信息


變量賦值
比如,我們的代碼里有一個(gè)變量,這個(gè)變量的值會(huì)影響到程序的執(zhí)行結(jié)果。如果我們想觀察這個(gè)變量在不同的賦值下程序的執(zhí)行結(jié)果怎么辦呢?難道要一遍遍的在代碼里修改變量值,然后重新運(yùn)行程序嗎?顯然這是非常麻煩的操作。如果利用Debug模式下的變量賦值(Set Value),只需要運(yùn)行一次,就能達(dá)到我們的觀察效果。在使用該變量的代碼處打個(gè)斷點(diǎn),然后在Variables窗口找到對(duì)應(yīng)的變量,修改變量值并執(zhí)行即可
如這里我們可以把b的值改為false,那么Toast輸出的值就是Hi


變量觀察
在Variables變量區(qū)和Watches觀察區(qū)可以查看Debug模式下,程序執(zhí)行到斷點(diǎn)處的變量值或者對(duì)象的各屬性值,如果程序比較復(fù)雜變量很多看起來(lái)就有點(diǎn)不方便。那么就可以通過(guò)彈出窗口的形式查看屬性值,只要將光標(biāo)定位至斷點(diǎn)代碼行所用到的變量,IDE會(huì)自動(dòng)彈出一個(gè)小窗口,如下圖所示,此時(shí),使用對(duì)應(yīng)的快捷鍵或者點(diǎn)擊這個(gè)小窗口里的變量即可彈出變量屬性值窗口,Mac下的快捷鍵位command + F1,如圖所示:

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

對(duì)象求值
在斷點(diǎn)處,如果有變量對(duì)象,系統(tǒng)提供了表達(dá)式求值功能,針對(duì)Variables視圖中的變量對(duì)象,我們可以輸入任何計(jì)算語(yǔ)句,實(shí)時(shí)查看表達(dá)式計(jì)算結(jié)果。具體操作為,右鍵Variables視圖中的變量對(duì)象,選擇Evaluate Expression,彈出表達(dá)式窗口,輸入任何你想要的計(jì)算語(yǔ)句,點(diǎn)擊Evaluate計(jì)算按鈕,即可顯示計(jì)算結(jié)果

方法斷點(diǎn)
當(dāng)我們想要觀察某個(gè)方法的調(diào)用時(shí)機(jī),可以使用方法斷點(diǎn)
這里有一個(gè)小建議,我們可以在寫(xiě)一個(gè)方法的時(shí)候,在方法注釋中列出方法入?yún)?,這樣一方面是可以給入?yún)⒃黾右恍┳⑨?,同時(shí)在打斷點(diǎn)的時(shí)候,也能非常直觀的看到方法入?yún)⒌闹?/p>

變量斷點(diǎn)
有時(shí)候,我們想知道自定義的變量的何時(shí)何地發(fā)生了改變,就可以使用變量斷點(diǎn)。在變量定義行打斷點(diǎn),開(kāi)啟Debug模式,在程序執(zhí)行的過(guò)程中,如果該變量的值發(fā)生改變,程序會(huì)自動(dòng)停下來(lái),并定位在改變變量值的地方。這里要注意的是,對(duì)于引用數(shù)據(jù)類型,通過(guò)set方法改變內(nèi)部的值并不會(huì)觸發(fā)變量斷點(diǎn),只有引用的地址發(fā)生改變才會(huì)觸發(fā)


異常斷點(diǎn)
程序在執(zhí)行的過(guò)程中可能會(huì)出現(xiàn)各種各樣的未知性異常,如果能在發(fā)生異常的時(shí)候第一時(shí)間讓程序停下來(lái),并定位到異常出現(xiàn)的地方,而不是讓?xiě)?yīng)用直接崩潰,那樣有時(shí)候能幫助我們更方便定位問(wèn)題
打開(kāi)斷點(diǎn)管理器,點(diǎn)擊工具欄菜單Run,選擇View Breakpoints;在Debug窗口直接點(diǎn)擊View Breakpoints圖標(biāo)。點(diǎn)擊左上角加號(hào)按鈕,可以添加各種斷點(diǎn),包括前文提到的Method Breakpoints和Field Watchpoints斷點(diǎn),這里我們選擇Exception Breakpoints異常斷點(diǎn),在彈出的Enter Exception Class窗口中輸入需要監(jiān)控的異常類別即可


這樣當(dāng)我們運(yùn)行下面的代碼,IDE會(huì)自動(dòng)幫我們定位到問(wèn)題發(fā)生的位置

總結(jié)
debug是非常非常基礎(chǔ)的技術(shù),所謂磨刀不誤砍柴工,掌握一些小技巧,往往能幫我們更高效的解決一些問(wèn)題。本文拋磚引玉,希望大家在開(kāi)發(fā)過(guò)程中多留心一些很基礎(chǔ)的技術(shù),有時(shí)候了解一些你認(rèn)為很不起眼的知識(shí)點(diǎn),能夠幫助你解決一些很棘手的問(wèn)題
但是,在多線程環(huán)境下,光靠 debug 是不行的。有時(shí) debug 本身會(huì)帶來(lái)一些問(wèn)題混淆了現(xiàn)場(chǎng),比如因?yàn)?debug 時(shí)的卡頓造成環(huán)境不一致等等,這時(shí)應(yīng)該學(xué)會(huì)使用打日志的形式幫忙調(diào)試,平時(shí)打日志的時(shí)候也應(yīng)該多注意一些規(guī)范,這樣能更方便排查問(wèn)題