Android studio 之 高级调试技巧,看这一篇够啦
下面,我們看看本文的項(xiàng)目目錄
- 一、日常使用
- 1.0,debug 項(xiàng)目,不再愁
- 1.1,查看項(xiàng)目所有斷點(diǎn)及刪除
- 1.2,臨時(shí)斷點(diǎn)
- 1.3,條件斷點(diǎn)
- 1.4,依賴斷點(diǎn)
- 1.5,接口斷點(diǎn)
- 1.6,異常斷點(diǎn)
- 1.7,變量斷點(diǎn)
- 1.8,斷點(diǎn)日志
- 1.9,斷點(diǎn)分組
- 1.10,Log 設(shè)置
- 1.11,主動(dòng)拋出異常
- 1.12,強(qiáng)制返回
- 1.13,返回上一步
- 1.14,添加/修改數(shù)據(jù)或查看變量的值
- 1.15,修改數(shù)據(jù)
- 1.16,強(qiáng)制拋出異常
- 1.17,多線程調(diào)試
- 1.18,遠(yuǎn)程調(diào)試
- 1.19,導(dǎo)入Crash錯(cuò)誤日志
- 1.20,Android Debuger 選擇調(diào)試類型
- 二、接手項(xiàng)目必備
- 2.1,布局查看器
- 2.2,查看棧頂(正在顯示的)Activity
一、 日常使用
1.0,debug 項(xiàng)目,不再愁
正常情況下,我們debug項(xiàng)目,需要重新編譯,重新跑一遍項(xiàng)目,尤其是在項(xiàng)目大,編譯時(shí)間長的時(shí)候,我們是相當(dāng)痛苦的。編譯10分鐘,調(diào)試20秒。
其實(shí),我們項(xiàng)目正在運(yùn)行的話,是可以直接給項(xiàng)目添加一個(gè)調(diào)試器,就可以像普通的debug一樣,進(jìn)行調(diào)試了。
- 1,點(diǎn)擊Attach Debugger toAndroid Process 按鈕
- 2,選中我們要調(diào)試的進(jìn)程,點(diǎn)擊確定
1.1,查看項(xiàng)目所有斷點(diǎn)及刪除
路徑:Android studio菜單欄–Run–View breakpoints
里畫對(duì)號(hào)的,都是我們打的斷點(diǎn)。點(diǎn)擊上面的“減號(hào)”,就可以刪除對(duì)應(yīng)的斷點(diǎn)。
1.2,臨時(shí)斷點(diǎn)
臨時(shí)斷點(diǎn),執(zhí)行一次就消失了。有些情況下,確實(shí)比較好用。打斷點(diǎn),我們都知道,那臨時(shí)斷點(diǎn)呢?
按住Alt鍵,再打斷點(diǎn),這樣就可以了,是不是優(yōu)秀
來張圖,感受下兩種斷點(diǎn)的區(qū)別。圈起來的就是臨時(shí)斷點(diǎn)啦。
1.3,條件斷點(diǎn)
有沒有在調(diào)試for循環(huán)的時(shí)候,出現(xiàn)過這種情況呢?
調(diào)試中.
i = 0
i = 1
i = 2
…
i = 10
矮油,我要看i=9的情況啊…展示哥手速的時(shí)候到啦,再來一次。。。。
。
現(xiàn)在,我們只需要在斷點(diǎn)上,點(diǎn)擊右鍵,在Condition那里,設(shè)置我們需要的值,循環(huán)就會(huì)自動(dòng)停到我們?cè)O(shè)置的那個(gè)值那里,是不是很激動(dòng)。
1.4,依賴斷點(diǎn)
顧名思義,就是一個(gè)一個(gè)斷點(diǎn)的執(zhí)行,依賴于另一個(gè)斷點(diǎn)。如果,第一個(gè)斷點(diǎn)不觸發(fā),那么第二個(gè)斷點(diǎn)也不會(huì)觸發(fā);相當(dāng)于綁定依賴的關(guān)系。路徑:Android studio菜單欄--Run--View breakpoints--選擇斷點(diǎn)
例如:有個(gè)功能線。A 功能點(diǎn)--通過 B 功能點(diǎn)--到達(dá) C 功能點(diǎn)--到達(dá) D 功能點(diǎn)--到達(dá) E 功能點(diǎn)。(真是的項(xiàng)目,肯定要復(fù)雜的多)
假如,現(xiàn)在功能線出問題了,并沒有走完所有的功能點(diǎn)。
我們就可以在A B C D E 都打上斷點(diǎn),并且 讓E依賴D,D依賴C...B依賴A。這樣的話,我們跑一遍就知道,在那個(gè)功能點(diǎn)上出問題了。
步驟:
-
1,打開View Breakpoints,如下圖
-
2,在某個(gè)斷點(diǎn)上,點(diǎn)擊右鍵,找到Disable until hitting the following breakpoint,選中此斷點(diǎn)要依賴的斷點(diǎn)(依賴的斷點(diǎn)不觸發(fā),次斷點(diǎn)也不會(huì)觸發(fā))。如下圖
1.5,接口斷點(diǎn)
有時(shí)候,我們接手新項(xiàng)目時(shí)。項(xiàng)目太大,而且都是通過接口隔離的。我們熟悉項(xiàng)目的難度就會(huì)很大。 這個(gè)時(shí)候,我們可以在接口聲明的方法上打斷點(diǎn)。如果,程序結(jié)果,其實(shí)現(xiàn)類的時(shí)候,就會(huì)執(zhí)行斷點(diǎn)。1.6,異常斷點(diǎn)
路徑:Android studio菜單欄--Run--View breakpoints--左上角加號(hào)---選擇Java Exception breakpoints當(dāng)程序出現(xiàn)異常后,我們可以通過添加對(duì)應(yīng)的異常斷點(diǎn)。添加對(duì)應(yīng)Exception的異常斷點(diǎn)后,程序執(zhí)行到該異常后,就會(huì)停留在異常位置。
1.7,變量斷點(diǎn)
就是在跟其他斷點(diǎn)一樣,在變量上打斷點(diǎn)。變量是對(duì)象的話,記得斷點(diǎn)右鍵,把Field Access勾選上。
這樣的好處就是,這個(gè)變量的值在那里改變的時(shí)候,斷點(diǎn)就會(huì)停留在哪里,如下圖
省去了,我們?yōu)榱瞬榭醋兞抠x值,到處打Log日志的麻煩。
1.8,斷點(diǎn)日志
打印Log日志,是我們調(diào)試程序,分析代碼問題的重要手段。
它也是有缺陷的:
- 有時(shí)候,我們會(huì)忘記,在某些重要地方打印日志。然后,會(huì)重新打日志,重新跑
- 打印的日志。很多時(shí)候,都會(huì)忘記刪除。(沒有日志管理的話,很多時(shí)候會(huì)跟著發(fā)布上線)
上面的情況,我相信很多人,都碰到過吧。
那么,有什么更好的方法來打印日志呢,當(dāng)然是斷點(diǎn)日志啦。
我們可以在View Breakpoints里面,在需要打印數(shù)據(jù)的斷點(diǎn)上,添加日志跟我們?cè)诖a里打印日志一樣。如下圖
這樣,我們就完美的避開了上面的問題,忘記打日志了,直接斷點(diǎn)出加上,還不用重新跑項(xiàng)目。
[1.9,斷點(diǎn)分組
當(dāng)我們接手的項(xiàng)目比較大的時(shí)候,我們需要斷點(diǎn)調(diào)試的地方就特別多。
這個(gè)時(shí)候,我們?nèi)绻馨凑展δ?#xff0c;把斷點(diǎn)放到對(duì)應(yīng)的分組。在調(diào)試某個(gè)功能時(shí),只開啟(或)對(duì)應(yīng)分組的斷點(diǎn),是不是就會(huì)很方便呢。
你別說,還真有這個(gè)功能。
扯完啦,開工。
- 首先打開View Breakpoints。(路徑:Run–View Breakpoints)
- 找到要分組的斷點(diǎn),點(diǎn)擊右鍵,Move to Group—Create New 。這樣我們就創(chuàng)建好了分組
- 最后,就是把該功能的其他斷點(diǎn),全部Move to Group到那個(gè)分組就可以了。
下圖就是創(chuàng)建了一個(gè)test的斷點(diǎn)分組
如果,我們暫時(shí)不想調(diào)試該功能,直接去掉 該分組前面的勾選就可以了。
如果想刪除斷點(diǎn),選中分組,直接點(diǎn)擊上面的“-”號(hào)就可以了
1.10,Log 設(shè)置
我們?cè)诖蛴og日志的時(shí)候,會(huì)看到前面有一長串的時(shí)間,包名等等信息,看起來特變繁瑣。像下面
我們只需要打開Logcat,點(diǎn)擊其左邊的設(shè)置按鈕,把不需要的信息,去掉勾選就可以了。
結(jié)果
這樣,是不是就清爽很多啦。
1.11,主動(dòng)拋出異常
我們可以在debug的時(shí)候。通過,主動(dòng)拋出異常,來檢測(cè)程序的執(zhí)行,是否符合我們的預(yù)期。
我們測(cè)試的時(shí)候,完全可以通過,在debug的時(shí)候,通過該技巧拋出異常,利用上面的異常斷點(diǎn)捕獲異常。
就是個(gè)玩兒…
1.12,強(qiáng)制返回
在某些場(chǎng)景下,我們需要測(cè)試不同的情況下,我們程序都是老老實(shí)實(shí)的呢。
不就是不斷的修改代碼的狀態(tài)來驗(yàn)證么,小意思…直到有一次,上線時(shí),代碼好像沒有改回來。。。翻車?yán)?br />
現(xiàn)在,我們可以通過Force Return(強(qiáng)制返回) 來強(qiáng)制返回不同的情況,以達(dá)到測(cè)試的效果,還不用修改代碼。終于,可以愉快的玩耍了。
看下怎么執(zhí)行Force Return
最后看下效果,通過isTrue()方法,返回不同的返回值來調(diào)試我們的程序。
1.13,返回上一步
你有沒有在調(diào)試的時(shí)候,碰到過這種情況,好不容易debug到我們要查看的地方,結(jié)果,一個(gè)不小心,手又快了,又的從頭跑一遍。
現(xiàn)在,我們可以利用Drop Frame來返回上一步,是不是又可以愉快的玩耍了。
大寫的注意:已經(jīng)改變的變量值不會(huì)恢復(fù)。
1.14,添加/修改數(shù)據(jù)或查看變量的值
有沒有遇到過,在打開debug之后,突然發(fā)現(xiàn),少寫了一些代碼。然后,加上,重新debug,跑完,去掉的呢。
我們可以利用evaluate Expression來查看變量的屬性,或者是給變量改變屬性。
這個(gè)東西絕對(duì)是,調(diào)試的利器
1.15,修改數(shù)據(jù)
數(shù)量放到變量的上面,點(diǎn)擊?號(hào),在變量上面右鍵–setValue,修改值后,就可以按照我們的測(cè)試意愿來執(zhí)行了。
1.16,強(qiáng)制拋出異常
有的時(shí)候,我們想看看我們的程序是否健壯,會(huì)模擬異常,然后,看下是否如我們想的一樣()。但是,每次調(diào)試都需要我們手動(dòng)的添加,然后異常,我們自己造的異常。假如,有一天,我們忘記了移除【黑天】
現(xiàn)在,我們不用擔(dān)心了,idea可以幫助我們強(qiáng)制拋出異常,是不是很興奮。
https://www.jetbrains.com/help/idea/altering-the-program-s-execution-flow.html#throw_exception
1.17,多線程調(diào)試
之前,在多線程調(diào)試的時(shí)候,我們無法控制線程的執(zhí)行順序,這是非常頭疼的【頭疼,腫么調(diào)】,
后來發(fā)現(xiàn),idea可以手動(dòng)設(shè)置線程的執(zhí)行順序,是不是歡喜。
看下,最后調(diào)試的效果
右擊斷點(diǎn)。選中suspend+Thread。
然后,進(jìn)入斷點(diǎn)后,我們就可以切換到我們想要執(zhí)行的線程上就可以了
1.18,遠(yuǎn)程調(diào)試
https://blog.csdn.net/kingdelee/article/details/83034876
https://www.jetbrains.com/help/idea/debugging-code.html#d181035e408
對(duì)于IDEA來說,只需要在Run->Edit Configuration里,增加一個(gè)Remote,設(shè)置主機(jī)Host和端口Port,然后調(diào)試它即可。
jetbrain
https://www.jetbrains.com/help/idea/tutorial-java-debugging-deep-dive.html
1.19,導(dǎo)入Crash錯(cuò)誤日志
項(xiàng)目上線后,不管使用哪個(gè)Crash抓取功能,我們看著都是非常不舒服。(費(fèi)眼,不能直接點(diǎn)到源碼位置)
那么,Android studio 有木有功能,能讓我們把錯(cuò)誤日志導(dǎo)入進(jìn)來呢?
答案是:當(dāng)然有。
-
1,首先,我們把錯(cuò)誤日志復(fù)制下來
-
2,然后,點(diǎn)擊Studio工具的 Analyze—Stack Trace Or Thread Dump
就會(huì)看到下面的輸入框了。
-
3,我們把復(fù)制的代碼,粘貼進(jìn)去,點(diǎn)擊OK。就會(huì)發(fā)現(xiàn)錯(cuò)誤日志跟我們平時(shí)開發(fā)時(shí)的異常一樣了,直接就可以點(diǎn)擊進(jìn)去。如下圖,
1.20,Android Debuger 選擇調(diào)試類型
Debug項(xiàng)目,對(duì)我們來說是很常用的技巧。
當(dāng)項(xiàng)目需要Debug的時(shí)候,有時(shí)候,C/C++報(bào)錯(cuò)的話,每次都需要停頓,像下面這樣
SIGSEGV (signal SIGSEGV: invalid address (fault address: 0x0))對(duì)調(diào)試程序來說,相當(dāng)繁瑣。
通過修改配置,可以選擇你想調(diào)試的類型 只調(diào)試Java程序還是Java和C++程序。
** 第一步 **
點(diǎn)擊菜單欄----run ----Edit Configurations
打開配置項(xiàng)
** 第二步 **
點(diǎn)擊選項(xiàng)Debugger,切換debug type,就可以了
二、接手項(xiàng)目必備
2.1,布局查看器
位置:sdk—tools–bin—uiautomatorviewer
功能:顯示當(dāng)前正在顯示的UI的布局結(jié)構(gòu)
功能類似于tools下面的monitor里面的DDMS查看布局文件,感覺更輕量級(jí)。
它可以幫助我們更快的熟悉,UI結(jié)構(gòu)
如下圖
2.2,查看棧頂(正在顯示的)Activity
命令:adb shell dumpsys window | findstr mCurrentFocus 或者
adb shell dumpsys activity activities
輸入命令就會(huì),現(xiàn)在當(dāng)前正在顯示的Activity的名字,幫我們快速定位文件位置。
如果連接的設(shè)備不止一個(gè)的話,執(zhí)行上面的命令,會(huì)提示,adb超過1個(gè)設(shè)備
adb.exe: more than one device/emulator這個(gè)時(shí)候,不要慌…
執(zhí)行下面命令,查看連接的設(shè)備名
adb devices就可以看到,連接的所有設(shè)備了。
List of devices attached 6c368f57 device emulator-5554 device只要,在上面的命令上添加 -s [設(shè)備名],就可以了。如下
adb -s 6c368f57 shell dumpsys window | findstr mCurrentFocus就又可以查看,我們想看的設(shè)備正在顯示的Activity名字了。
未完待續(xù)…
總結(jié)
以上是生活随笔為你收集整理的Android studio 之 高级调试技巧,看这一篇够啦的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 黎曼流形学习的学习笔记(2):Neura
- 下一篇: 走上软测之路