androidStudio“高級(jí)Debug”調(diào)試技巧

介紹frames删豺、threads椭微、evaluate的使用,斷點(diǎn)的一些屬性以及條件斷點(diǎn)之众、日志斷點(diǎn)拙毫、異常斷點(diǎn)等使用場(chǎng)景,幫助提高debug效率


跳過單步調(diào)試的stepOver stepInto等基礎(chǔ)調(diào)試棺禾,從上一幅圖開始缀蹄。

frames查看幀調(diào)用關(guān)系

image.png

圖中右邊箭頭指著的圖標(biāo)用來控制是否顯示frames。
左邊的箭頭指著的是調(diào)用關(guān)系膘婶,從Debug的frames也可以看到:onClick是在performClick中調(diào)用的缺前,同時(shí)可以看到前面是由ActivityThread調(diào)用。
即使沒有導(dǎo)入frameWork的源碼,從這里點(diǎn)進(jìn)去悬襟,也是可以看到ActivityThread(frameWork層)的源碼的P坡搿!脊岳!(just a joke肆良,只能看看,不能調(diào)試frameWork)
image.png

通過這種方式也可以看到activityThread逸绎,可以看到app的入口main函數(shù)惹恃,就和java的public static void main一樣!
順便看看驗(yàn)證下ui線程的Looper也是要prepare loop的棺牧,只是activityThread在main函數(shù)里面提前做了罷了巫糙。
image.png

Thread查看線程信息

image.png

這里開了2個(gè)線程來執(zhí)行doSomeTask函數(shù),然后在deSomeTask那里斷點(diǎn)颊乘,從debug的Threads可以看到除了Thread-154参淹,另外還有個(gè)Thread-155也是被斷到了的醉锄,把斷點(diǎn)放開后會(huì)接著由155線程執(zhí)行doSomeTask。而且從這里我們也可以意識(shí)到這是多線程訪問浙值,bug可能來源于線程同步未做好恳不。

evaluate計(jì)算運(yùn)行到斷點(diǎn)時(shí)的相關(guān)狀態(tài)

image.png

evaluate就是左邊箭頭指著的像計(jì)算器的那個(gè)小圖標(biāo)。
當(dāng)運(yùn)行到斷點(diǎn)的時(shí)候开呐,點(diǎn)擊evaluate,彈出左邊的彈框烟勋,輸入要計(jì)算的表達(dá)式,如當(dāng)前的線程信息或者其他你想知道的東西筐付。如圖可以看到當(dāng)前線程id是155卵惦,所以不是ui線程(threadId = 1),如果在這個(gè)函數(shù)執(zhí)行ui操作會(huì)拋出異常(非ui線程更新ui)瓦戚。
這個(gè)操作簡(jiǎn)直666啊沮尿,如果以前按單步調(diào)試想看某一項(xiàng)信息就比如threadId,必須要寫一行代碼较解,重新編譯運(yùn)行

long threadId = Thread.currentThread().getId();

然后斷點(diǎn)到這里看threadId變量的值是多少畜疾,而且調(diào)試完了之后還需要把這行代碼刪除掉,用evaluate簡(jiǎn)直太方便印衔。

幾種特殊斷點(diǎn)

image.png

點(diǎn)擊紅色箭頭或者右鍵黑色箭頭指向的斷點(diǎn)都可以彈出右邊的彈框:設(shè)置斷點(diǎn)的各種屬性庸疾。
粉紅色的Suspend指是否掛起,如果勾選了(默認(rèn)suspend)当编,執(zhí)行到斷點(diǎn)處會(huì)停下。
藍(lán)色的Condition指掛起的條件徒溪,勾選后忿偷,符合所寫表達(dá)式的條件才會(huì)停下。
黃色的Evaluate and log指會(huì)將evaluate的值打印到console上臊泌。
紅色的filters指Class的過濾鲤桥,比如只看某個(gè)類的斷點(diǎn)或者不看某個(gè)類的斷點(diǎn)。
不同的斷點(diǎn)方式由不同的斷點(diǎn)條件組合而成渠概。

  • 條件斷點(diǎn)
    勾選Condition茶凳,然后寫上需要的條件,比如圖中我覺得Bug很可能出現(xiàn)在isRequestWeb = false的情況播揪,我就把condition寫上去贮喧,執(zhí)行時(shí)忽略掉為true的情況,專心查看為flase的情況猪狈。
    又比如循環(huán)遍歷的時(shí)候箱沦,不想一直手動(dòng)跳到下一個(gè)斷點(diǎn)查看每一個(gè)循環(huán)體,就可以寫一個(gè)自己想要的條件斷下來雇庙。
  • 日志斷點(diǎn)
    有的時(shí)候改bug谓形,不確定問題在哪兒灶伊,不能瞎J8到處斷點(diǎn),一步一步的調(diào)試寒跳,這樣太低效了聘萨。這時(shí)就需要打日志出來看。
    但是log的代碼寫上bug改完后童太,還要把這些log刪除掉米辐,比較麻煩。更麻煩的是加寫一句log康愤,又要重新編譯一次儡循。這時(shí)就需要使用日志斷點(diǎn)。
    打上斷點(diǎn)征冷,把Suspend打鉤取消掉择膝,這樣程序不會(huì)被斷點(diǎn)斷下來。然后evaluate and log寫上需要打印的日志即可检激。


    image.png
image.png

如圖無需加代碼肴捉,無需重新編譯。直接再觸發(fā)一次斷點(diǎn)叔收,在debug的Console那里就可以看到運(yùn)行的日志(之前演示多線程的例子齿穗,這里就是典型的線程同步的問題,導(dǎo)致請(qǐng)求了2次網(wǎng)絡(luò))

  • 異常斷點(diǎn)
    看斷點(diǎn)方式那幅圖綠色的箭頭指向的+饺律,顯示出另外幾種斷點(diǎn)


    image.png

    其中第一個(gè)是方法斷點(diǎn):也就是斷點(diǎn)打在方法上窃页,斷點(diǎn)的樣子會(huì)像左邊的圖標(biāo)那樣(和在方法體里的第一行代碼打斷點(diǎn)差不多)。
    第二種是field斷點(diǎn):用來查看字段的訪問(和在getter setter斷點(diǎn)相似)


    image.png

    第三種java異常斷點(diǎn)好像有點(diǎn)雞肋的复濒,程序異常的時(shí)候脖卖,可以通過異常斷點(diǎn)查看是哪個(gè)地方出問題了。但是崩潰的時(shí)候巧颈,也可以通過AS的崩潰日志鎖定出問題的地方畦木。
    選中第三個(gè)java exception 斷點(diǎn),在里面輸入格式轉(zhuǎn)化出錯(cuò)的異常
    image.png

    OK后斷點(diǎn)里面就有這個(gè)format異常的斷點(diǎn)了砸泛。


    image.png

    圖中可以看到十籍,上面還可以選擇Any Exception,即只要是exception都會(huì)斷到唇礁。
    強(qiáng)行寫一個(gè)NumberFormat異常勾栗,然后重新運(yùn)行,進(jìn)入debug模式盏筐,觸發(fā)異常:
               String a = "12a";
                try {
                    int b = Integer.parseInt(a);
                } catch (NumberFormatException e) {
                    e.printStackTrace();
                }
image.png

可以看到是MainActiviy的237行出現(xiàn)了NumberFormatException,點(diǎn)擊進(jìn)入到對(duì)應(yīng)行械姻,果然是那里的問題。
這里為了方便查看就把frames的調(diào)用關(guān)系隱藏掉了,點(diǎn)擊之前frames說的那個(gè)圖標(biāo)即可楷拳。

異常斷點(diǎn)可以結(jié)合各種filter使用绣夺,比如結(jié)合class Filter只查看MainActiviy里面的異常,或者不查看BinaryThree里面的異常欢揖,崩潰日志就做不到這一點(diǎn)陶耍。

image.png

后面的三種暫時(shí)也沒用到過,就跳過了她混。

  • 其他
    調(diào)試的花樣還有烈钞,比如在變量表里面setValue改變變量值、添加到watcher觀察等操作坤按。
    總之一切為了提高效率毯欣!人生苦短~~
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市臭脓,隨后出現(xiàn)的幾起案子酗钞,更是在濱河造成了極大的恐慌,老刑警劉巖来累,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件砚作,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡嘹锁,警方通過查閱死者的電腦和手機(jī)葫录,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來领猾,“玉大人米同,你說我怎么就攤上這事∷じ停” “怎么了面粮?”我有些...
    開封第一講書人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)拯坟。 經(jīng)常有香客問我,道長(zhǎng)韭山,這世上最難降的妖魔是什么郁季? 我笑而不...
    開封第一講書人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮钱磅,結(jié)果婚禮上梦裂,老公的妹妹穿的比我還像新娘。我一直安慰自己盖淡,他們只是感情好年柠,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著褪迟,像睡著了一般冗恨。 火紅的嫁衣襯著肌膚如雪答憔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評(píng)論 1 290
  • 那天掀抹,我揣著相機(jī)與錄音虐拓,去河邊找鬼。 笑死傲武,一個(gè)胖子當(dāng)著我的面吹牛蓉驹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播揪利,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼态兴,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了疟位?” 一聲冷哼從身側(cè)響起瞻润,我...
    開封第一講書人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎献汗,沒想到半個(gè)月后敢订,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡罢吃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年楚午,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尿招。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡矾柜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出就谜,到底是詐尸還是另有隱情怪蔑,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布丧荐,位于F島的核電站缆瓣,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏虹统。R本人自食惡果不足惜弓坞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望车荔。 院中可真熱鬧渡冻,春花似錦、人聲如沸忧便。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至超歌,卻和暖如春砍艾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背握础。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工辐董, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人禀综。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓简烘,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親定枷。 傳聞我的和親對(duì)象是個(gè)殘疾皇子孤澎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,839評(píng)論 25 707
  • Android Studio目前已經(jīng)成為開發(fā)Android的主要工具,用熟了可謂相當(dāng)順手欠窒。作為開發(fā)者覆旭,調(diào)試并發(fā)現(xiàn)b...
    7d3fadbb4407閱讀 555評(píng)論 0 3
  • 又是一天一日游。 今天游覽檔次升級(jí)岖妄,配備有中文導(dǎo)游型将,一個(gè)法國(guó)小老太太,中文發(fā)音很準(zhǔn)荐虐,語調(diào)溫柔七兜,還帶著不知哪里的口音...
    西蘇Sisu閱讀 398評(píng)論 0 0
  • 定位----做事情需要給自己定位 展示----該出手時(shí)就要出手 吸粉留粉---發(fā)揮自己的實(shí)力,魅力福扬,一切技能吸引別...
    達(dá)浪Dalang閱讀 115評(píng)論 0 0
  • 耳朵餓了 你的聲音會(huì)是某種食物 眼睛餓了 你的笑容會(huì)是某種食物 心餓了 愛會(huì)變成某種食物 我餓了 你會(huì)是我的食物
    七天吶閱讀 212評(píng)論 0 4