Android Studio調(diào)試技巧

Android Studio目前已經(jīng)成為開發(fā)Android的主要工具蜜葱,用熟了可謂相當(dāng)順手。作為開發(fā)者俐巴,調(diào)試并發(fā)現(xiàn)bug骨望,進(jìn)而解決,可是我們的看家本領(lǐng)欣舵。正所謂擎鸠,工欲善其事必先利其器,和其他開發(fā)工具一樣缘圈,如Eclipse劣光、Idea,Android Studio也為我們提供了強(qiáng)大的調(diào)試技巧糟把,今天我們就來看看Android Studio中有關(guān)調(diào)試的技巧绢涡。
首先,來看看Android studio中為我們提供的調(diào)試面板(標(biāo)準(zhǔn)情況下):


點(diǎn)擊右上角Restore ‘Threads’View可先展示目前相關(guān)的線程信息:


android studio大體為我們提供了7個功能區(qū):
單步調(diào)試區(qū)
斷點(diǎn)管理區(qū)
求值表達(dá)式
線程幀棧區(qū)
對象變量區(qū)
變量觀察區(qū)

下面我們分別對這七個區(qū)域進(jìn)行介紹遣疯。
單步調(diào)試區(qū)
該區(qū)提供了調(diào)試的主要操作雄可,和你所熟知的一樣的,主要有:Step over缠犀、step into数苫、force step into、step out辨液、drop frame虐急。

Show Execution Point

點(diǎn)擊該按鈕,光標(biāo)將定位到當(dāng)前正在調(diào)試的位置.

Step Over

單步跳過,點(diǎn)擊該按鈕將導(dǎo)致程序向下執(zhí)行一行滔迈。如果當(dāng)前行是一個方法調(diào)用止吁,此行調(diào)用的方法被執(zhí)行完畢后再到下一行。比如當(dāng)前代碼是:

int num=10;
int min=Math.min(num,100);
System.out.println(min);

如果當(dāng)前調(diào)試的是第二行燎悍,當(dāng)點(diǎn)擊step over時敬惦,Math.min(num,100)方法先執(zhí)行完后跳到第三行.

Step Into

單步跳入,執(zhí)行該操作將導(dǎo)致程序向下執(zhí)行一行间涵。如果該行有自定義的方法仁热,則進(jìn)入該方法內(nèi)部繼續(xù)執(zhí)行榜揖,需要注意如果是類庫中的方法勾哩,則不會進(jìn)入方法內(nèi)部。

Force Step Into

強(qiáng)制單步跳入举哟,和step into功能類似思劳,主要區(qū)別在于:如果當(dāng)前行有任何方法,則不管該方法是我們自行定義還是類庫提供的妨猩,都能跳入到方法內(nèi)部繼續(xù)執(zhí)行

Drop Frame

沒有好記的名字潜叛,大意理解為中斷執(zhí)行,并返回到方法執(zhí)行的初始點(diǎn),在這個過程中該方法對應(yīng)的棧幀會從棧中移除.換言之,如果該方法是被調(diào)用的,則返回到當(dāng)前方法被調(diào)用處,并且所有上下文變量的值也恢復(fù)到該方法未執(zhí)行時的狀態(tài)。簡單的舉例來說明:

public class DebugDemo {
private String name = "default";

public void alertName() {
    System.out.println(name);
    debug();
}

public void debug() {
    this.name = "debug";
}

public static void main(String[] args) {
    new DebugDemo().alertName();
}
}

當(dāng)你在調(diào)試debug()時威兜,執(zhí)行該操作销斟,將回調(diào)到debug()被調(diào)用的地方,也就是alertName()方法椒舵。如果此時再繼續(xù)執(zhí)行drop frame蚂踊,將回調(diào)到alertName()被調(diào)用的地方,也就是main().

Force Run to Cursor

非常好用的一個功能,可以忽視已經(jīng)存在的斷點(diǎn),跳轉(zhuǎn)到光標(biāo)所在處.舉個簡單例子說明下:


比如現(xiàn)在第10行,此時我想調(diào)試18行而又不想一步一步調(diào)試,能不能一次到位呢?我們只需要將光標(biāo)定位到相應(yīng)的位置,然后執(zhí)行Force Run to Cursor即可:


Evaluate expression

點(diǎn)擊該按鈕會在當(dāng)前調(diào)試的語句處嵌入一個交互式解釋器笔宿,在該解釋器中犁钟,你可以執(zhí)行任何你想要執(zhí)行的表達(dá)式進(jìn)行求值操作。比如泼橘,我們在調(diào)試時執(zhí)行到以下代碼:


此時執(zhí)行Evaluate Expression涝动,就相當(dāng)于在調(diào)試行之前嵌入了一個交互式解釋器,那么在該解釋器中我們能做什么呢炬灭?在這里醋粟,我們可以對result進(jìn)行求值操作:對著你想要求值得位置點(diǎn)擊鼠標(biāo)右鍵,選擇evaluate Expression.此時會顯示如下:


在彈出的輸入框中輸入求值表達(dá)式担败,比如這里我們輸入Math.min(result,50)
,如下圖


點(diǎn)擊執(zhí)行昔穴,我們發(fā)現(xiàn)在Result中已經(jīng)輸出了結(jié)果,如下:


斷點(diǎn)管理區(qū)

Return

點(diǎn)擊該按鈕會停止目前的應(yīng)用,并且重新啟動.換言之,就是你想要重新調(diào)試時,可以使用該操作,嗯,就是重新來過的意思.

Pause Program

點(diǎn)擊該按鈕將暫停應(yīng)用的執(zhí)行.如果想要恢復(fù)則可以使用下面提到的Resume Program.

Resume Program

該操作有恢復(fù)應(yīng)用的含義,但是卻有兩種行為:
在應(yīng)用處在暫停狀態(tài)下,點(diǎn)擊該按鈕將恢復(fù)應(yīng)用運(yùn)行.
在很多情況下提前,我們會設(shè)置多個斷點(diǎn)以便調(diào)試吗货。在某些情況下,我們需要從當(dāng)前斷點(diǎn)移動到下一個斷點(diǎn)處狈网,兩個斷點(diǎn)之間的代碼自動被執(zhí)行宙搬,這樣我們就不需要一步一步調(diào)試到下一個斷點(diǎn)了,省時又省力拓哺。舉例說明:

public void test(){ 
test1(); 
... test2();
}

假設(shè)我們分別在第2行和第4行添加了斷點(diǎn)勇垛。如果此時我們調(diào)試在第2行,此時點(diǎn)擊執(zhí)行該操作士鸥,當(dāng)前調(diào)試位置會自動執(zhí)行到第4行闲孤,也就是第2到第4行之間的代碼會自動被執(zhí)行。

Stop

點(diǎn)擊該按鈕會通過相關(guān)的關(guān)閉腳本來終止當(dāng)前進(jìn)程.換言之,對不同類型的工程可能有不同的停止行為,比如:對普通的Java項(xiàng)目,點(diǎn)擊該按鈕意味著退出調(diào)試模式,但是應(yīng)用還會執(zhí)行完成.而在Android項(xiàng)目中,點(diǎn)擊該按鈕,則意味這app結(jié)束運(yùn)行.
這里我們以一個普通的JAVA工程為例:


此時如果我們執(zhí)行停止操作烤礁,發(fā)現(xiàn)程序退出調(diào)試模式讼积,并正常執(zhí)行完畢,Console中結(jié)果如下:


View Breakpoints

點(diǎn)擊該按鈕會進(jìn)入斷點(diǎn)管理界面脚仔,在這里你可以查看所有斷點(diǎn),管理或者配置斷點(diǎn)的行為,如:刪除勤众,修改屬性信息等:


Mute Breakpoints

使用該按鈕來切換斷點(diǎn)的狀態(tài):啟動或者禁用.在調(diào)試過程中,你可以禁用暫時禁用所有的斷點(diǎn),已實(shí)現(xiàn)應(yīng)用正常的運(yùn)行.該功能非常有用,比如當(dāng)你在調(diào)試過程中,突然不想讓斷點(diǎn)干擾你所關(guān)心的流程時,可以臨時禁用斷點(diǎn).

Get thread dump

獲取線程Dump,點(diǎn)擊該按鈕將進(jìn)入線程Dump界面:


借此我們順便介紹一下dump界面:線程工具區(qū)中最常用的是


,可以用來過濾線程,其他的不做解釋了
解析來我們來認(rèn)識一下線程的類型,表示為不同的圖標(biāo):
線程狀態(tài)描述
圖標(biāo)

Thread is suspended.


Thread is waiting on a monitor lock.


Thread is running.


Thread is executing network operation, and is waiting for data to be passed.


Thread is idle.


Event Dispatch Thread that is busy.


Thread is executing disk operation.


Settings

這里寫圖片描述

點(diǎn)擊該按鈕將打開有關(guān)設(shè)置的列表:


我們對其中的幾個進(jìn)行說明:
Show Values Inline
調(diào)試過程中開啟該功能,將會代碼右邊顯示變量值,即下圖中紅框所示部分:


Show Method Return Values
調(diào)試過程中啟用該功能,將在變量區(qū)顯示最后執(zhí)行方法的返回值.舉個例子來說,首先,關(guān)閉該功能,我們調(diào)試這段代碼并觀察其變量區(qū):


開啟該功能之后,再來觀察變量區(qū)的變化:


繼續(xù)往下調(diào)試:


繼續(xù)往下調(diào)試:


這個功能簡直是棒極了,在調(diào)試一段代碼,并想看該代碼中最后調(diào)用方法的最終結(jié)果時就非常有用了.
Auto-Variables Mode
開啟這個功能后,idea的Debugger會自動評估某些變量,大概就是當(dāng)你執(zhí)行在某個斷點(diǎn)時,Debugger會檢測當(dāng)前調(diào)試點(diǎn)之前或者之后的變量的狀態(tài),然后在變量區(qū)選擇性輸出.舉個例子來說明,未開啟該功能之前,變量區(qū)輸出所有的變量信息:


開啟之后,當(dāng)你調(diào)試到第13行時,Debugger檢測到num變量在之后沒有被使用,那么在變量區(qū)就不會輸出該變量的信息.


Sort values alphabetically
開啟這個功能的化,變量區(qū)中的輸出內(nèi)容會按照按字母順序進(jìn)行排序,很簡單,不常用,還是按照默認(rèn)的順序好.

Help

這個不用說了,有任何不明白的都可以查看官方幫助文檔,這是我見到最好的文檔之一.其他幾個操作:Settings,Pin,Close留給各位自己去使用.
修改變量值
在調(diào)試過程中,我們可以方便的修改某個變量的值鲤脏,如下:


在上圖中们颜,當(dāng)前result的值經(jīng)過計算為10吕朵,這里我們通過Set Value將其計算結(jié)果修改為100.
變量觀察區(qū)
該區(qū)域?qū)@示你所感興趣的變量的值。在調(diào)試模式下窥突,你可以通過Add to Watches將某個變量添加到觀察區(qū)努溃,該值的變化將會在變量觀察區(qū)顯示。操作如下:


這里我們對name比較感興趣阻问,希望看到它的值的變化情況茅坛,因此我們將其“特殊關(guān)照”。需要注意则拷,此時因?yàn)閚ame是成員變量贡蓖,因此在對象觀察區(qū)也可看到該值。如果是局部變量煌茬,無疑只能用這種方式了斥铺。
斷點(diǎn)的分類
到目前為止,我們已經(jīng)簡單的介紹了調(diào)試功能區(qū)坛善,斷點(diǎn)管理區(qū)晾蜘,求值表達(dá)式,這三個區(qū)域的功能眠屎。在上面剔交,我們不斷的提到了斷點(diǎn)一次,但是斷點(diǎn)是什么呢改衩?想必大部分人已經(jīng)知道了岖常,我們這里在簡單的說明下:
斷點(diǎn)是調(diào)試器的功能之一,可以讓程序暫停在需要的地方葫督,幫助我們進(jìn)行分析程序的運(yùn)行過程竭鞍。

在Android Studio中,斷點(diǎn)又被以下五類:
條件斷點(diǎn)
日志斷點(diǎn)
異常斷點(diǎn)
方法斷點(diǎn)
屬性斷點(diǎn)

其中方法斷點(diǎn)是我們最熟悉的斷點(diǎn)類型橄镜,相信沒有人不會偎快。下面我們著重介紹其他四種類型的斷點(diǎn)。
條件斷點(diǎn)
所謂的條件斷點(diǎn)就是在特定條件發(fā)生的斷點(diǎn)洽胶,也就是晒夹,我們可將某個斷點(diǎn)設(shè)置為只對某種事件感興趣,最典型的應(yīng)用就是在列表循環(huán)中姊氓,我們希望在某特定的元素出現(xiàn)時暫停程序運(yùn)行丐怯。比如,現(xiàn)在我們有個list中他膳,其中包含了q响逢,1q绒窑,2q,3q四個元素棕孙,我們希望在遍歷到2q時暫停程序運(yùn)行,那么需要進(jìn)行如下操作:在需要的地方添加斷點(diǎn),如下:


斷點(diǎn)處左鍵單擊蟀俊,在Condition處填寫過濾條件.此處我們只關(guān)心2q钦铺,因此填寫s.equals("2q")

日志斷點(diǎn)
該類型的斷點(diǎn)不會使程序停下來,而是在輸出我們要它輸出的日志信息肢预,然后繼續(xù)執(zhí)行矛洞。具體操作如下:同樣在斷點(diǎn)處左鍵單擊,在彈出的對話框中取消選中Suspend烫映。


在彈出的控制面板中沼本,選中Log evaluated expression,然后再填寫想要輸出的日志信息锭沟,如下:


當(dāng)調(diào)試過程遇到該斷點(diǎn)將會輸出結(jié)果抽兆,如下:


異常斷點(diǎn)
所謂的異常斷點(diǎn)就是在調(diào)試過程中,一旦發(fā)生異常(可以指定某類異常)族淮,則會立刻定位到異常拋出的地方辫红。比如在調(diào)試異常中,我們非常關(guān)注運(yùn)行時異常祝辣,希望在產(chǎn)生任何運(yùn)行異常時及時定位贴妻,那么此時就可以利用該類型異常,在上線之前蝙斜,進(jìn)行異常斷點(diǎn)調(diào)試非常有利于減少正式環(huán)境中發(fā)生crash的幾率名惩。具體操作如下:在Run菜單項(xiàng)中,選擇View Breakpoints(也可以在斷點(diǎn)管理面板中點(diǎn)擊


)孕荠,如下:


在管理斷點(diǎn)面板中绢片,點(diǎn)擊+

在彈出的下拉選擇列表中,我們選擇Java Exception Breakpoints


這里我們選中Search By Name,在下面的輸入框中輸入我們所關(guān)心的異常類型岛琼。此處我們關(guān)心NullPointerException底循,在調(diào)試過程一旦發(fā)生NullPointerException,調(diào)試器就會定位到異常發(fā)生處槐瑞。



方法斷點(diǎn)

(略過吧熙涤,應(yīng)該沒人不知道了)

Filed WatchPoint

Filed WatchPoint是本質(zhì)上是一種特殊的斷點(diǎn),也稱為屬性斷點(diǎn):當(dāng)我們某個字段值被修改的時候困檩,程序暫停在修改處祠挫。通常在調(diào)試多線程時尤為可用,能幫我們及時的定位并發(fā)錯誤的問題悼沿。其使用和添加普通的斷點(diǎn)并無不同等舔,斷點(diǎn)圖標(biāo)稍有不同
調(diào)試的兩種方式
到目前,調(diào)試的相關(guān)基礎(chǔ)我們已經(jīng)介紹完了糟趾,但是不少童鞋對Android Studio中


這兩個按鈕感到困惑:Debug和Attach process慌植。這里我們就簡單介紹一下這兩者的區(qū)別:
Debug:以調(diào)試模式安裝運(yùn)行甚牲,斷點(diǎn)可以在運(yùn)行之前設(shè)置,也可在運(yùn)行后設(shè)置蝶柿,是多數(shù)人最常用的調(diào)式方式
Attach process:和Debug方式相比丈钙,能夠?qū)⒄{(diào)試器attach到任何正在運(yùn)行的進(jìn)程。比如交汤,我們可以通過attach process到想要調(diào)試的進(jìn)程雏赦。然后,在需要的地方設(shè)置相關(guān)斷點(diǎn)即可芙扎。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末星岗,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子戒洼,更是在濱河造成了極大的恐慌伍茄,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件施逾,死亡現(xiàn)場離奇詭異敷矫,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)汉额,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門曹仗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蠕搜,你說我怎么就攤上這事怎茫。” “怎么了妓灌?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵轨蛤,是天一觀的道長。 經(jīng)常有香客問我虫埂,道長祥山,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任掉伏,我火速辦了婚禮缝呕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘斧散。我一直安慰自己供常,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布鸡捐。 她就那樣靜靜地躺著栈暇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪箍镜。 梳的紋絲不亂的頭發(fā)上源祈,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天煎源,我揣著相機(jī)與錄音,去河邊找鬼新博。 笑死,一個胖子當(dāng)著我的面吹牛脚草,可吹牛的內(nèi)容都是我干的赫悄。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼馏慨,長吁一口氣:“原來是場噩夢啊……” “哼埂淮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起写隶,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤倔撞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后慕趴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體痪蝇,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年冕房,在試婚紗的時候發(fā)現(xiàn)自己被綠了躏啰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡耙册,死狀恐怖给僵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情详拙,我是刑警寧澤帝际,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站饶辙,受9級特大地震影響蹲诀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜弃揽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一侧甫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蹋宦,春花似錦披粟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蒿辙,卻和暖如春拇泛,著一層夾襖步出監(jiān)牢的瞬間滨巴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工俺叭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留恭取,地道東北人。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓熄守,卻偏偏與公主長得像蜈垮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子裕照,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評論 2 355

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