本文介紹使用Android Studio開發(fā)應(yīng)用程序時(shí)進(jìn)行斷點(diǎn)調(diào)試相關(guān)的知識(shí)悯恍。干貨滿滿鞭达,適合初學(xué)者學(xué)習(xí)话肖。
1. 調(diào)試模式
想要進(jìn)行斷點(diǎn)調(diào)試疲酌,首先要進(jìn)入調(diào)試模式蜡峰。
1.1 開發(fā)者模式
首先要做手機(jī)上開啟開發(fā)者模式,然后在開發(fā)者模式中打開“USB調(diào)試”開關(guān)朗恳,有些設(shè)備上還要開啟“USB安裝”湿颅、“USB調(diào)試”等開關(guān),這要看具體的手機(jī)設(shè)備系統(tǒng)僻肖。
此時(shí)使用電腦連接手機(jī)時(shí)肖爵,會(huì)彈出USB調(diào)試授權(quán)彈框,點(diǎn)擊確定即可臀脏。
關(guān)于如何打開“開發(fā)者模式”劝堪,不同的手機(jī)有不同的方式,可以在網(wǎng)上搜索揉稚。
1.1 連接已運(yùn)行的進(jìn)程
當(dāng)設(shè)備連接到電腦后秒啦,在Android Studio的工具欄就可以看到已連接的設(shè)備了。
點(diǎn)擊右側(cè)這個(gè)按鈕“Attach Debugger to Android Process”搀玖,彈出進(jìn)程選擇彈框余境。
選擇進(jìn)程并點(diǎn)擊確認(rèn)按鈕,即可進(jìn)入調(diào)試模式灌诅。
1.2 運(yùn)行并連接
點(diǎn)擊這個(gè)“Debug ‘a(chǎn)pp’”按鈕芳来,可以安裝完應(yīng)用后立即進(jìn)入調(diào)試模式。
1.3 啟動(dòng)時(shí)連接
有時(shí)我們希望調(diào)試已安裝應(yīng)用的啟動(dòng)過(guò)程猜拾,但是使用“Debug 'app'”按鈕會(huì)重新編譯安裝即舌,這樣會(huì)很慢且覆蓋掉現(xiàn)有的應(yīng)用,此時(shí)可以在手機(jī)上設(shè)定“選擇調(diào)試應(yīng)用”挎袜,并打開“等待調(diào)試器”:
這時(shí)在打開“Test”應(yīng)用(已選擇調(diào)試的應(yīng)用)顽聂,就會(huì)彈出等待調(diào)試對(duì)話框
1.4 連接非主進(jìn)程
一次調(diào)試連接過(guò)程只能對(duì)一個(gè)進(jìn)程進(jìn)行調(diào)試紊搪,如果要調(diào)試非主進(jìn)程蜜葱,需要在選擇調(diào)試進(jìn)程界面選擇期望的進(jìn)程。
2. 斷點(diǎn)
2.1 斷點(diǎn)簡(jiǎn)介
在代碼區(qū)左側(cè)點(diǎn)擊即可添加斷點(diǎn)
當(dāng)代碼執(zhí)行到斷點(diǎn)處會(huì)暫停
斷點(diǎn)狀態(tài)下耀石,可以在Variables窗口(圖中右下側(cè)窗口)查看當(dāng)前環(huán)境下的變量信息牵囤,同時(shí)也可以修改變量的內(nèi)容。
點(diǎn)擊Evaluate Expression...按鈕娶牌,彈出表達(dá)式計(jì)算彈框奔浅,在這里可以執(zhí)行任何語(yǔ)句或查看任何變量的內(nèi)容。
2.2 條件斷點(diǎn)
在斷點(diǎn)上點(diǎn)擊彈出斷點(diǎn)菜單诗良,勾選“Condition”后汹桦,可以在下面的框中輸入任意條件語(yǔ)句,只有當(dāng)此處的條件為true的時(shí)候才會(huì)觸發(fā)斷點(diǎn)鉴裹。
2.3 非中斷斷點(diǎn)
在圖2-5中取消勾選“Suspend”選項(xiàng)舞骆,斷點(diǎn)就變成了非中斷斷點(diǎn)。顧名思義径荔,非中斷斷點(diǎn)并不會(huì)中斷程序的執(zhí)行督禽。
勾選“Evaluate and log”并在下面的輸入框中輸入任意語(yǔ)句,在代碼運(yùn)行到這個(gè)位置的時(shí)候就會(huì)執(zhí)行該語(yǔ)句总处。一般情況下可以輸出log或者改變某個(gè)變量的值狈惫。
如果輸出log,可以在調(diào)試模式的Console窗口中看到輸出
2.4 變量&方法斷點(diǎn)
可以在變量和方法上添加斷點(diǎn)鹦马,代碼將在變量改變(或訪問(wèn)時(shí)胧谈,可在斷點(diǎn)菜單中設(shè)置)和方法調(diào)用(進(jìn)入或退出,可設(shè)置)時(shí)中斷荸频,當(dāng)然也可以執(zhí)行指定的語(yǔ)句菱肖。
值得注意的時(shí),在方法上添加斷點(diǎn)會(huì)導(dǎo)致程序運(yùn)行異常緩慢旭从。
2.5 異常斷點(diǎn)
點(diǎn)擊Debug菜單中的“View Breakpoints...”按鈕(如圖2-8)稳强,彈出斷點(diǎn)管理頁(yè)面。勾選“Java Exception Breakpoints”和悦,應(yīng)用中任意代碼崩潰時(shí)都會(huì)觸發(fā)斷點(diǎn)退疫。
在圖2-8中還能夠看到添加的所有斷點(diǎn)并進(jìn)行管理。
2.5 多線程斷點(diǎn)
一個(gè)線程只能被一個(gè)斷點(diǎn)阻塞鸽素,所以不存在在多個(gè)斷點(diǎn)間切換的問(wèn)題蹄咖。
如果在不同的線程都打了斷點(diǎn),且都處于阻塞中付鹿,那如何切換不同的阻塞線程呢澜汤?
在Frames頁(yè)面點(diǎn)擊頂部的下拉框,下拉部分展示了當(dāng)前的線程信息舵匾,其中包含了正在查看的阻塞線程(紅色對(duì)勾項(xiàng))和其他正被斷點(diǎn)阻塞的線程(紅點(diǎn)項(xiàng))俊抵,選擇其他線程并點(diǎn)擊,則可以切換查看阻塞的其他線程坐梯。
2.6 屏蔽所有斷點(diǎn)
點(diǎn)擊Mute Breakpoints 按鈕可以快速屏蔽所有斷點(diǎn)徽诲,這避免了刪除辛辛苦苦添加的斷點(diǎn)。
3. 跟進(jìn)調(diào)試
上圖是調(diào)試界面的菜單按鈕砚殿,下面從左向右依次介紹各按鈕的功能囤锉。
- Show Execution Point 點(diǎn)擊該按鈕可以快速定位到正在中斷的代碼位置床嫌。
- Step Over 這個(gè)是單步調(diào)試,可在斷點(diǎn)處一行一行的執(zhí)行代碼
- Step Into 點(diǎn)擊這個(gè)按鈕可以進(jìn)入到當(dāng)前行的方法內(nèi)部
- Force Step Into 使用Step Info按鈕無(wú)法進(jìn)入到某些jdk方法中钱贯,此時(shí)可以用這個(gè)按鈕
- Step Out 這個(gè)和Step Into 功能相反,會(huì)從當(dāng)前正在執(zhí)行的方法返回
- Drop Frame 丟棄當(dāng)前幀侦另,這會(huì)使斷點(diǎn)回到當(dāng)前方法調(diào)用前的位置秩命。需要注意的是,雖然調(diào)用棸担可以回滾弃锐,但是已經(jīng)影響的變量數(shù)據(jù)并不會(huì)還原。低版本的Android Studio可能不支持這個(gè)功能殿托,我所用的4.0.2上這個(gè)按鈕是灰色的霹菊,不支持點(diǎn)擊。
- Run to Cursor 點(diǎn)擊這個(gè)按鈕會(huì)執(zhí)行到光標(biāo)所在的行支竹。
以上功能都存在快捷鍵旋廷,或者可以自定義快捷鍵。熟記并使用快捷鍵可以有效提高調(diào)試效率唾戚。除此之外還有其他僅提供快捷鍵的調(diào)試工具柳洋,可以通過(guò)查看快捷鍵表去了解。
4. 問(wèn)題列表
4.1 上文中提到的某些窗口看不到
在Debug窗口的右上方點(diǎn)擊這個(gè)按鈕叹坦,即可打開或關(guān)不指定的窗口熊镣。
4.2 如何調(diào)試Release包?
可以參考這篇文章募书。
4.3 設(shè)備問(wèn)題
在華為設(shè)備上绪囱,如果斷點(diǎn)在生命周期方法上,那么幾秒后應(yīng)用就會(huì)崩潰從而無(wú)法繼續(xù)調(diào)試莹捡。此時(shí)可以采用非中斷斷點(diǎn)鬼吵,在斷點(diǎn)處添加log或修改變量進(jìn)行調(diào)試。