Xcode調(diào)試方法匯總

在開(kāi)發(fā)當(dāng)中我自己用到的最多的肯定是斷點(diǎn)調(diào)試了,但是強(qiáng)大的Xcode顯然不止這么一點(diǎn)調(diào)試優(yōu)化工具,這篇文章就用來(lái)記錄并分享我用的幾種方法:【本文持續(xù)更新凑懂,歡迎大家提出寶貴建議】

一膘螟、斷點(diǎn)調(diào)試

【1.普通斷點(diǎn)】斷點(diǎn)(Breakpoint)絕對(duì)是調(diào)試程序的第一大選擇,也是掌握的基礎(chǔ)技能枚荣。顧名思義,當(dāng)程序運(yùn)行到斷點(diǎn)處時(shí)會(huì)暫停運(yùn)行啼肩。比如斷點(diǎn)打在11行橄妆,那么程 序就會(huì)停在11行(注意:程序只運(yùn)行到了前10行,第11行其實(shí)還沒(méi)有被執(zhí)行F碜埂:δ搿!)赦拘。只要在代碼行旁邊點(diǎn)擊慌随,就能添加一個(gè)斷點(diǎn),再次點(diǎn)擊躺同,就能讓斷點(diǎn)不 可用(disable了阁猜,仍然存在,只是不起作用了)蹋艺。在某一行創(chuàng)建斷點(diǎn)的快捷鍵是:command+\

此時(shí)斷點(diǎn)有效
此時(shí)斷點(diǎn)無(wú)效

并能在調(diào)試過(guò)程中在下方看到參數(shù)的值:

調(diào)試過(guò)程

注意:斷點(diǎn)調(diào)試中還有一個(gè)經(jīng)常用到的命令是po剃袍,用來(lái)打印對(duì)象信息

【2.條件斷點(diǎn)】以上的斷點(diǎn)只是最普通的,我們還能對(duì)斷點(diǎn)的屬性進(jìn)行配置捎谨,設(shè)置條件民效,使斷點(diǎn)更加智能化,右鍵斷點(diǎn)進(jìn)入編輯對(duì)話框:

在斷點(diǎn)上右鍵即可

我以一個(gè)循環(huán)作為測(cè)試代碼:

簡(jiǎn)單的一個(gè)for循環(huán)

循環(huán)中的代碼每次都要單步執(zhí)行涛救,可能這并不是我想要的畏邢。我想要在i為3的時(shí)候中斷程序,進(jìn)行調(diào)試检吆,編寫(xiě)條件如下:

編寫(xiě)條件

設(shè)置i==3的條件后舒萎,程序就會(huì)在該條件時(shí)中斷,而不會(huì)每次到達(dá)該位置都中斷咧栗。中斷時(shí)輸出如下:

斷點(diǎn)條件輸出

同時(shí)也可以設(shè)置Ignore參數(shù)逆甜,會(huì)忽略前面n次的斷點(diǎn)運(yùn)行,會(huì)在第n+1次中斷致板。

設(shè)置參數(shù)

調(diào)試輸出如下:

設(shè)置循環(huán)次數(shù)斷開(kāi)

同時(shí)交煞,還可以查看某個(gè)函數(shù)被調(diào)用的次數(shù),設(shè)置Action參數(shù)如下斟或,注意要選中Automatically continue after evaluating actions.

查看某個(gè)函數(shù)被調(diào)用的次數(shù)

輸出結(jié)果如下:

查看某個(gè)函數(shù)被調(diào)用的次數(shù)

【3.異常斷點(diǎn)】斷點(diǎn)的功能不限于上面所述素征。開(kāi)發(fā)iOS知道,如果我們因?yàn)楫惓H缓蟪绦騝rash了,代碼就直接跑到main.m的main函數(shù)中去了御毅。為什么就不能跑到出現(xiàn)異常的代碼中呢根欧??端蛆?異常斷點(diǎn)就為我們解決該問(wèn)題凤粗,程序就會(huì)在異常出現(xiàn)的那行代碼終止。創(chuàng)建異常斷點(diǎn)圖例如下:

異常斷點(diǎn)

如下所示就創(chuàng)建完成了今豆。如果碰到異常crash時(shí)嫌拣,嘗試使用異常斷點(diǎn)吧。

異常斷點(diǎn)

【4.符號(hào)斷點(diǎn)Symbolic Breakpoint】符號(hào)斷點(diǎn)的創(chuàng)建也同異常斷點(diǎn)呆躲。一般符號(hào)斷點(diǎn)可以在你指定的[類(lèi)名 方法名]時(shí)中斷執(zhí)行异逐。【創(chuàng)建方法如上圖】

符號(hào)斷點(diǎn)Symbolic Breakpoint

配置符號(hào)斷點(diǎn)如下:可以當(dāng)執(zhí)行到ViewController類(lèi)的viewDidLoad方法時(shí)中斷執(zhí)行插掂。

配置符號(hào)斷點(diǎn)

如果你的Symbol只寫(xiě)了一個(gè)函數(shù)名灰瞻,那么就會(huì)在出現(xiàn)該函數(shù)名的地方就中斷執(zhí)行。如下辅甥,就會(huì)在運(yùn)行到doAnimation的時(shí)候中斷酝润。是不是很強(qiáng)大呢?

以上為斷點(diǎn)調(diào)試璃弄,歡迎大家補(bǔ)充指正袍祖,下面介紹另外的幾種調(diào)試:

二、視圖調(diào)試

如今iOS開(kāi)發(fā)的UI設(shè)計(jì)有很多種方式谢揪,比如storyboard,xib捐凭,代碼實(shí)現(xiàn)拨扶。對(duì)于stoayboard,xib可視化實(shí)現(xiàn)是比較簡(jiǎn)單的, 但是對(duì)于一些“iOS老程序員”而言茁肠,都喜歡使用代碼實(shí)現(xiàn)UI患民,并且可能UI層次還比較復(fù)雜。這樣就給我們新接手項(xiàng)目的開(kāi)發(fā)者帶來(lái)很多困擾垦梆。如何快速查看 一個(gè)復(fù)雜UI的界面層次和布局匹颤,最快的方法就是用到視圖調(diào)試。

打開(kāi)視圖調(diào)試的方法

當(dāng)項(xiàng)目運(yùn)行到某一個(gè)界面(可以是模擬器或真機(jī))時(shí)托猩,開(kāi)啟視圖調(diào)試印蓖,點(diǎn)擊按鈕如圖:這樣就會(huì)進(jìn)入試圖調(diào)試,你可以很方便的查看這個(gè)界面京腥。這里可以看到控件之間的層次關(guān)系赦肃。

可以利用兩個(gè)藍(lán)色的進(jìn)度條來(lái)增大角度和過(guò)濾部分視圖,也可以直接拖拽旋轉(zhuǎn)查看

左側(cè)的樹(shù)形層次圖可以在查看線程、隊(duì)列和UI之間切換:

這里也可以看到系統(tǒng)控件的結(jié)構(gòu)

可以通過(guò)選中左側(cè)控件名稱(chēng)就可以在右側(cè)看到控件的位置【藍(lán)色加深部分】,只要控件存在大小他宛,并且已經(jīng)添加到視圖范圍內(nèi)船侧,就會(huì)在右側(cè)顯示。

三厅各、僵尸對(duì)象

iOS中把那些已經(jīng)release但還沒(méi)完全消失的對(duì)象叫做僵尸對(duì)象镜撩,對(duì)已經(jīng)release的對(duì)象再次釋放,就會(huì)發(fā)生異常队塘。雖然自從使用ARC后袁梗, 由于對(duì)象釋放產(chǎn)生的異常已經(jīng)大大變少,但偶爾還會(huì)出現(xiàn)人灼。開(kāi)啟僵尸對(duì)象模式后围段,就能快速定位到異常位置。開(kāi)啟方式如 下:Product-->Scheme-->Edit Scheme.. 勾選Enable Zombie Objects即可投放。

這里再加一個(gè)工具就是Analyze分析器奈泪,Analyze分析器是一種靜態(tài)的工具,可以對(duì)我們的程序進(jìn)行分析灸芳,找出我們未使用的變量涝桅,或一些死存儲(chǔ)。執(zhí)行Analyze如下:Product-->Analyze. 如下藍(lán)色的標(biāo)記就是靜態(tài)分析的結(jié)果烙样。

分析結(jié)果

當(dāng)然冯遂,我們可以設(shè)置在編譯程序的時(shí)候同時(shí)Analyze,把下列選項(xiàng)設(shè)為Yes即可谒获。


但是我一般不這么做蛤肌,可能是寫(xiě)代碼習(xí)慣的問(wèn)題吧,我通常是寫(xiě)完了之后再使用分析器分析批狱,不僅可以分析出哪里的變量未使用裸准,還可以分析出哪里可能為空造成異常,打開(kāi)分析器快捷鍵command + shift + b

四赔硫、Instruments中l(wèi)eaks工具調(diào)試內(nèi)存泄漏

【1.leaks工具】Instruments這個(gè)里面的工具真的太牛了炒俱,我目前也只掌握了兩種,以后還有會(huì)用的會(huì)再到這里更新爪膊。
靜態(tài)分析器Analyze并不能分析出代碼里所有的內(nèi)存問(wèn)題权悟,比如說(shuō)有時(shí)候內(nèi)存泄漏是在用戶(hù)操作的時(shí)候才產(chǎn)生的,這個(gè)時(shí)候就需要用到leaks工具來(lái)進(jìn)行調(diào)試了推盛,可以在這里找到Instruments

第一個(gè)就是了

打開(kāi)后是這個(gè)樣子

圖1

先選中leaks然后點(diǎn)擊choose就可以打開(kāi)了烛缔,打開(kāi)后是這樣:

這里的意思是在iPhone7 plus上運(yùn)行你的工程進(jìn)行測(cè)試住册,可能你第一次打開(kāi)那里選擇的 my mac脖阵,你可以像選擇模擬器一樣的點(diǎn)擊選擇你要的設(shè)備拍屑,這里不要選真機(jī)荷辕,否則你會(huì)看不到你的代碼!件豌!無(wú)法修改疮方,回歸正題,這里選好了設(shè)備和工程之后點(diǎn)擊紅色的點(diǎn)運(yùn)行茧彤,像正常操作一樣把每一個(gè)步驟都實(shí)驗(yàn)一下骡显,如果你看到Allocations那行有出現(xiàn)紅色菱形就代表那一塊有內(nèi)存泄露了。這個(gè)時(shí)候點(diǎn)擊停止按鈕

然后下一步就可以看代碼了:

注意要選擇的選項(xiàng)

你只要在這些方法上雙擊曾掂,就會(huì)跳轉(zhuǎn)到具體的代碼惫谤,進(jìn)入到代碼去之后會(huì)這樣:

這個(gè)是網(wǎng)上找的MRC環(huán)境下的一個(gè)例子

這里應(yīng)該是提示100%內(nèi)存會(huì)泄露。所以就著重在這里查代碼了珠洗,因?yàn)閮?nèi)存泄漏可能會(huì)很大程度的影響程序的穩(wěn)定性A锿帷!

【2.Time Profiler工具
Time Profiler分析原理:它按照固定的時(shí)間間隔來(lái)跟蹤每一個(gè)線程的堆棧信息许蓖,通過(guò)統(tǒng)計(jì)比較時(shí)間間隔之間的堆棧狀態(tài)蝴猪,來(lái)推算某個(gè)方法執(zhí)行了多久,并獲得一個(gè)近似值膊爪。其實(shí)從根本上來(lái)說(shuō)與我們的原始分析方法異曲同工自阱,只不過(guò)其將各個(gè)方法消耗的時(shí)間統(tǒng)計(jì)起來(lái),同樣是從Instruments中打開(kāi)米酬。
選擇Time Profiler工具開(kāi)始測(cè)試沛豌,這時(shí)會(huì)自動(dòng)啟動(dòng)模擬器和Time Profiler錄制。
先進(jìn)行一些App的操作赃额,讓Time Profiler收集足夠的數(shù)據(jù)加派,尤其是你覺(jué)得那些有性能瓶頸的地方。

4跳芳、5哼丈、6所標(biāo)記的面板是需要關(guān)注的:
4是擴(kuò)展面板,用來(lái)跟蹤顯示堆棧筛严;5是詳細(xì)地面板,可以從這里看到cpu運(yùn)行的時(shí)間都消耗在哪里饶米;6是選項(xiàng)面板桨啃,可以用來(lái)設(shè)置Time Profiler的運(yùn)行參數(shù)。
通過(guò)對(duì)應(yīng)用的操作檬输,可以在詳細(xì)面板中看到那些最耗時(shí)的操作是哪些照瘾,并可以逐行展開(kāi)查看:

圖標(biāo)為黑色頭像的就是Time Profiler給我們的提示,有可能存在性能瓶頸的地方丧慈,可以逐漸向下展開(kāi)析命,找到產(chǎn)生的根本原因主卫。
比如我們通過(guò)分析,發(fā)現(xiàn)[CMTool getNewsTimeFromLong]這個(gè)時(shí)間格式化函數(shù)可能需要優(yōu)化鹃愤。

當(dāng)然這里只是舉一個(gè)例子簇搅,性能調(diào)優(yōu)應(yīng)該首先從整體到細(xì)節(jié)的順序進(jìn)行,才能收到最明顯的效果软吐。Time Profiler參數(shù)設(shè)置:

這里邊幾個(gè)選項(xiàng)的含義如下:
Separate by Thread: 每個(gè)線程應(yīng)該分開(kāi)考慮瘩将。只有這樣你才能揪出那些大量占用CPU的"重"線程
Invert Call Tree:
從上倒下跟蹤堆棧,這意味著你看到的表中的方法,將已從第0幀開(kāi)始取樣,這通常你是想要的,只有這樣你才能看到CPU中話費(fèi)時(shí)間最深的方法.也就是說(shuō)FuncA{FunB{FunC}}
勾選此項(xiàng)后堆棧以C->B-A 把調(diào)用層級(jí)最深的C顯示在最外面

Hide Missing Symbols: 如果dSYM無(wú)法找到你的app或者系統(tǒng)框架的話,那么表中看不到方法名只能看到十六進(jìn)制的數(shù)值,如果勾線此項(xiàng)可以隱藏這些符號(hào),便于簡(jiǎn)化數(shù)據(jù)

Hide System Libraries: 勾選此項(xiàng)你會(huì)顯示你app的代碼,這是非常有用的. 因?yàn)橥ǔD阒魂P(guān)心cpu花在自己代碼上的時(shí)間不是系統(tǒng)上的

Show Obj-C Only: 只顯示oc代碼 ,如果你的程序是像OpenGl這樣的程序,不要勾選側(cè)向因?yàn)樗锌赡苁荂++的

Flatten Recursion: 遞歸函數(shù), 每個(gè)堆棧跟蹤一個(gè)條目

Top Functions:
一個(gè)函數(shù)花費(fèi)的時(shí)間直接在該函數(shù)中的總和,以及在函數(shù)調(diào)用該函數(shù)所花費(fèi)的時(shí)間的總時(shí)間凹耙。因此姿现,如果函數(shù)A調(diào)用B,那么A的時(shí)間報(bào)告在A花費(fèi)的時(shí)間加上B花費(fèi)的時(shí)間,這非常真有用肖抱,因?yàn)樗梢宰屇忝看蜗碌秸{(diào)用堆棧時(shí)挑最大的時(shí)間數(shù)字备典,歸零在你最耗時(shí)的方法。
上面的參數(shù)在實(shí)踐中合理設(shè)置意述,也沒(méi)有什么太多技巧提佣,就是通過(guò)數(shù)據(jù)的隱藏、顯示讓我們更關(guān)注于想找到的數(shù)據(jù)欲险。

目前先就寫(xiě)這些吧镐依,寫(xiě)這篇文章只是想把我平時(shí)看到的一些知識(shí)以及自己的一些體會(huì)通過(guò)這樣的方式集中整理復(fù)習(xí)一下,這樣以后會(huì)更加方便熟練天试。


instruments調(diào)試部分參照自:http://www.cnblogs.com/ym123/p/4324335.html
其中斷點(diǎn)調(diào)試部分參照自:http://www.cnblogs.com/gongyuhonglou/p/5806433.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末槐壳,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子喜每,更是在濱河造成了極大的恐慌务唐,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件带兜,死亡現(xiàn)場(chǎng)離奇詭異枫笛,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)刚照,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)刑巧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人无畔,你說(shuō)我怎么就攤上這事啊楚。” “怎么了浑彰?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵恭理,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我郭变,道長(zhǎng)颜价,這世上最難降的妖魔是什么涯保? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮周伦,結(jié)果婚禮上夕春,老公的妹妹穿的比我還像新娘。我一直安慰自己横辆,他們只是感情好撇他,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著狈蚤,像睡著了一般困肩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上脆侮,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天锌畸,我揣著相機(jī)與錄音,去河邊找鬼靖避。 笑死潭枣,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的幻捏。 我是一名探鬼主播盆犁,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼篡九!你這毒婦竟也來(lái)了谐岁?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤榛臼,失蹤者是張志新(化名)和其女友劉穎伊佃,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體沛善,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡航揉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了金刁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帅涂。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖尤蛮,靈堂內(nèi)的尸體忽然破棺而出漠秋,到底是詐尸還是另有隱情,我是刑警寧澤抵屿,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站捅位,受9級(jí)特大地震影響轧葛,放射性物質(zhì)發(fā)生泄漏搂抒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一尿扯、第九天 我趴在偏房一處隱蔽的房頂上張望求晶。 院中可真熱鬧,春花似錦衷笋、人聲如沸芳杏。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)爵赵。三九已至,卻和暖如春泊脐,著一層夾襖步出監(jiān)牢的瞬間空幻,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工容客, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留秕铛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓缩挑,卻偏偏與公主長(zhǎng)得像但两,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子供置,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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

  • 對(duì)于軟件開(kāi)發(fā)而言谨湘,調(diào)試是必須學(xué)會(huì)的技能,重要性不言而喻士袄。對(duì)于調(diào)試的技能悲关,基本上是可以遷移的,也就是說(shuō)你以前在其他平...
    豆瓣菜閱讀 1,800評(píng)論 0 6
  • 程序調(diào)試的基本思想是“分析現(xiàn)象->假設(shè)錯(cuò)誤原因->產(chǎn)生新的現(xiàn)象去驗(yàn)證假設(shè)”這樣一個(gè)循環(huán)過(guò)程娄柳,根據(jù)現(xiàn)象如何假設(shè)錯(cuò)誤原...
    Manfred_Zone閱讀 16,543評(píng)論 0 26
  • NSLog,po命令和普通斷點(diǎn)調(diào)試相信每個(gè)iOS開(kāi)發(fā)者都會(huì)寓辱,這里就不作介紹了。 一赤拒、Memory Graph Xc...
    wu大維閱讀 12,183評(píng)論 16 187
  • 離開(kāi)孩子們半個(gè)月挎挖,今天終于恢復(fù)了以往的陪伴这敬,上午收拾了好大一會(huì),把自己整理完蕉朵,給孩子們做了最?lèi)?ài)吃的混沌崔涂,孩...
    AA穩(wěn)穩(wěn)閱讀 191評(píng)論 0 2