Xcode幾種調(diào)試方法總結(jié)

前言:編寫(xiě)代碼過(guò)程中出現(xiàn)錯(cuò)誤、異常是不可避免的霜幼。通常我們都需要進(jìn)行大量的調(diào)試去尋找涤伐、解決問(wèn)題洗搂。這時(shí),熟練掌握調(diào)試技巧將很大程度上的提高工作效率沛申。接下來(lái)就說(shuō)說(shuō)開(kāi)發(fā)過(guò)程中Xcode的調(diào)試方法劣领。

1、Enable NSZombie Objects (開(kāi)啟僵尸對(duì)象)铁材。

這個(gè)技巧主要用來(lái)追終重復(fù)釋放的問(wèn)題尖淘。個(gè)人認(rèn)為,ARC推出以來(lái)著觉。項(xiàng)目的基本是基于ARC環(huán)境村生。不用開(kāi)發(fā)者主動(dòng)去調(diào)用release去釋放對(duì)象,所以不用太在意這個(gè)方法饼丘。這里就不多做介紹了趁桃。想了解該方法的同學(xué)請(qǐng)坐飛機(jī)

2、 斷點(diǎn)調(diào)試(全局?jǐn)帱c(diǎn)肄鸽、條件斷點(diǎn))

一卫病、全局?jǐn)帱c(diǎn)

NSArray *aa = @[@2,@4];
NSLog(@"%@",aa[3]);

這兩行代碼,沒(méi)有添加全局?jǐn)帱c(diǎn)時(shí)典徘,運(yùn)行crash忽肛,直接就跳到了mian函數(shù),如下圖:


1.jpeg

接下來(lái)添加全局?jǐn)帱c(diǎn)烂斋,方法如下圖:


2.jpeg

添加之后運(yùn)行屹逛,奔潰后,程序停留在了crash那行代碼汛骂。
3.jpeg

是不是很方便罕模,很省事。哈哈A辈t。╬s 不過(guò)有的crash淑掌,這種方式定位不到)

二、條件斷點(diǎn):設(shè)置斷點(diǎn)觸發(fā)的條件蝶念,方便開(kāi)發(fā)者對(duì)特定情況進(jìn)行調(diào)試

如下圖:
在for循環(huán)中添加一個(gè)斷點(diǎn)抛腕。右擊斷點(diǎn)選擇”Edit BreakPoint”,然后設(shè)置斷點(diǎn)觸發(fā)條件芋绸。


4.jpeg

這個(gè)例子當(dāng) “i==5”時(shí),斷點(diǎn)觸發(fā)担敌,如下圖:


5.jpeg

3摔敛、Static Analyzer (靜態(tài)分析)

Static Analyzer主要用于分析內(nèi)存,避免內(nèi)存泄漏全封。主要對(duì)以下情況進(jìn)行分析马昙。
未使用的實(shí)例變量、未初始化的實(shí)例變量刹悴、類(lèi)型不兼容行楞、無(wú)法達(dá)到的路徑、引用空指針
使用:command + shift +B土匀,如下圖就能輕松找到可能內(nèi)存泄漏的代碼子房,然后我們根據(jù)代碼環(huán)境進(jìn)行修復(fù)就可以了(ps:有的內(nèi)存泄漏可能檢測(cè)不出來(lái),還是需要我們?cè)趯?xiě)代碼時(shí)對(duì)內(nèi)存這塊多留點(diǎn)心就轧。)


6.jpeg

4池颈、 LLDB調(diào)試器

這個(gè)方法是我今天主推的方法。比較高級(jí)钓丰,也更加靈活躯砰、方便。
隨著Xcode5携丁,LLDB調(diào)試器已經(jīng)取代了GDB琢歇,成為了Xcode工程中默認(rèn)的調(diào)試器。其實(shí)Xcode已經(jīng)幫我們完成了大部分工作梦鉴,而且很多東西也可以在Xcode中直接看到李茫。所以這里我們只列舉常用的命令。
打印:p,print的縮寫(xiě):該命令如果打印的是簡(jiǎn)單類(lèi)型則會(huì)列出簡(jiǎn)單類(lèi)型的的類(lèi)型和值肥橙,如果是對(duì)象會(huì)打印出對(duì)象的地址魄宏。
po,print Object 的縮寫(xiě),用于輸出對(duì)象
如下如存筏,當(dāng)運(yùn)行到斷點(diǎn)處時(shí)宠互,控制臺(tái)就會(huì)出現(xiàn)LLDB的調(diào)試命令行。我們只需在這里進(jìn)行調(diào)試椭坚。

7.jpeg

expr:expression的縮寫(xiě)予跌,可以在調(diào)試時(shí)動(dòng)態(tài)執(zhí)行指定表達(dá)式,并將結(jié)果打印出來(lái)善茎。常用于在調(diào)試過(guò)程中修改變量的值券册。
如上圖,你在控制臺(tái)輸入
expr a=2
你就能看到
(NSInteger) $11 = 2
這是a的值就被動(dòng)態(tài)改成了2
除此之外,還可以使用這個(gè)命令生成一個(gè)新的對(duì)象烁焙,如:
expr int $b = 0
p $b 這條命令用于輸出新申明對(duì)象的值(注意要加$)
image: image命令可用于尋址航邢,有多個(gè)組合命令,在控制臺(tái)輸入help image可查看image的用法骄蝇。比較實(shí)用的用法是用于尋找棧地址對(duì)應(yīng)的代碼位置膳殷,下面我們來(lái)舉個(gè)例子:

NSArray *array = @[@1,@2];
NSLog(@"%@",array[2]);

這段代碼很明顯會(huì)crash,運(yùn)行之后拋出下面的異常

2017-03-23 22:26:11.014 Test[3631:136626] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayI objectAtIndex:]: index 2 beyond bounds [0 .. 1]'
*** First throw call stack:
(
    0   CoreFoundation                      0x0000000104f28f45 __exceptionPreprocess + 165
    1   libobjc.A.dylib                     0x00000001049a2deb objc_exception_throw + 48
    2   CoreFoundation                      0x0000000104e17b14 -[__NSArrayI objectAtIndex:] + 164
    3   Test                                0x00000001044a5829 -[ViewController viewDidLoad] + 265
    4   UIKit                               0x0000000105467cc4 -[UIViewController loadViewIfRequired] + 1198
    5   UIKit                               0x0000000105468013 -[UIViewController view] + 27
    6   UIKit                               0x000000010534151c -[UIWindow addRootViewControllerViewIfPossible] + 61
    7   UIKit                               0x0000000105341c05 -[UIWindow _setHidden:forced:] + 282
    8   UIKit                               0x00000001053534a5 -[UIWindow makeKeyAndVisible] + 42
    9   UIKit                               0x00000001052cd396 -[UIApplication _callInitializationDelegatesForMainScene:transitionContext:] + 4131
    10  UIKit                               0x00000001052d39c3 -[UIApplication _runWithMainScene:transitionContext:completion:] + 1750
    11  UIKit                               0x00000001052d0ba3 -[UIApplication workspaceDidEndTransaction:] + 188
    12  FrontBoardServices                  0x0000000107c83784 -[FBSSerialQueue _performNext] + 192
    13  FrontBoardServices                  0x0000000107c83af2 -[FBSSerialQueue _performNextFromRunLoopSource] + 45
    14  CoreFoundation                      0x0000000104e55011 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
    15  CoreFoundation                      0x0000000104e4af3c __CFRunLoopDoSources0 + 556
    16  CoreFoundation                      0x0000000104e4a3f3 __CFRunLoopRun + 867
    17  CoreFoundation                      0x0000000104e49e08 CFRunLoopRunSpecific + 488
    18  UIKit                               0x00000001052d04f5 -[UIApplication _run] + 402
    19  UIKit                               0x00000001052d530d UIApplicationMain + 171
    20  Test                                0x00000001044a5baf main + 111
    21  libdyld.dylib                       0x000000010764c92d start + 1
    22  ???                                 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

現(xiàn)在我懷疑出錯(cuò)的地址是0x00000001044a5829(可根據(jù)執(zhí)行文件名或最小的棧地址判斷)為進(jìn)一步精確定位我們可輸入以下命令image lookup --address 0x00000001044a5829
命令執(zhí)行后返回結(jié)果如下:

 Address: Test[0x0000000100001829] (Test.__TEXT.__text + 265)
 Summary: Test`-[ViewController viewDidLoad] + 265 at ViewController.m:21

由此乞榨,我們可以看出出錯(cuò)的地方是ViewController.m文件的第21行秽之。
我們還可以使用image lookup命令查看具體的類(lèi),如下:

(lldb) image lookup --type UIView
Best match found in /Users/jamalping/Library/Developer/Xcode/DerivedData/Test-gviuudbzlyhssmanjxpwhchdbscz/Build/Products/Debug-iphonesimulator/Test.app/Test:
id = {0x00001e8d}, name = "UIView", byte-size = 8, decl = UIView.h:144, clang_type = "@interface UIView : UIResponder
@property ( getter = isUserInteractionEnabled,setter = setUserInteractionEnabled:,assign,readwrite,nonatomic ) BOOL userInteractionEnabled;
@property ( getter = tag,setter = setTag:,assign,readwrite,nonatomic ) NSInteger tag;
@property ( readonly,getter = layer,setter = <null selector>,nonatomic ) CALayer * layer;
@property ( readonly,getter = isFocused,setter = <null selector>,nonatomic ) BOOL focused;
@property ( getter = semanticContentAttribute,setter = setSemanticContentAttribute:,assign,readwrite,nonatomic ) UISemanticContentAttribute semanticContentAttribute;
@end
"

**call **
call:即調(diào)用当娱,如我們?cè)趘iewDidLoad: 設(shè)置一個(gè)斷點(diǎn)吃既,在程序中斷的時(shí)候輸入call self.view.backgroudColor = [UIColo redColor]繼續(xù)運(yùn)行程序,view就變成紅色了跨细,在調(diào)試的時(shí)候靈活運(yùn)用call命令可以達(dá)到事半功倍的效果鹦倚。
**參考: **
objc.io#19#與調(diào)試器共舞 - LLDB 的華爾茲
淺談LLDB調(diào)試器
Getting interactive with the debugger

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市冀惭,隨后出現(xiàn)的幾起案子震叙,更是在濱河造成了極大的恐慌,老刑警劉巖散休,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件媒楼,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡戚丸,警方通過(guò)查閱死者的電腦和手機(jī)划址,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)限府,“玉大人夺颤,你說(shuō)我怎么就攤上這事⌒采祝” “怎么了世澜?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)署穗。 經(jīng)常有香客問(wèn)我寥裂,道長(zhǎng),這世上最難降的妖魔是什么案疲? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任抚恒,我火速辦了婚禮,結(jié)果婚禮上络拌,老公的妹妹穿的比我還像新娘俭驮。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布混萝。 她就那樣靜靜地躺著遗遵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪逸嘀。 梳的紋絲不亂的頭發(fā)上车要,一...
    開(kāi)封第一講書(shū)人閱讀 50,084評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音崭倘,去河邊找鬼翼岁。 笑死,一個(gè)胖子當(dāng)著我的面吹牛司光,可吹牛的內(nèi)容都是我干的琅坡。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼残家,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼榆俺!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起坞淮,我...
    開(kāi)封第一講書(shū)人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤茴晋,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后回窘,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體诺擅,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年啡直,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了烁涌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡付枫,死狀恐怖烹玉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情阐滩,我是刑警寧澤二打,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站掂榔,受9級(jí)特大地震影響继效,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜装获,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一瑞信、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧穴豫,春花似錦凡简、人聲如沸逼友。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)帜乞。三九已至,卻和暖如春筐眷,著一層夾襖步出監(jiān)牢的瞬間黎烈,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工匀谣, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留照棋,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓武翎,卻偏偏與公主長(zhǎng)得像烈炭,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子后频,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

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

  • 劍未配好梳庆,出門(mén)已是江湖暖途。 最近一直沒(méi)有更新簡(jiǎn)書(shū)是因?yàn)樵陂_(kāi)發(fā)和測(cè)試階段卑惜,有任務(wù),沒(méi)有進(jìn)行學(xué)習(xí)驻售,不過(guò)在做任務(wù)的時(shí)...
    和玨貓閱讀 8,148評(píng)論 9 75
  • 轉(zhuǎn)載 與調(diào)試器共舞 - LLDB 的華爾茲: https://objccn.io/issue-19-2/ 推薦:i...
    F麥子閱讀 3,331評(píng)論 0 10
  • [轉(zhuǎn)]淺談LLDB調(diào)試器文章來(lái)源于:http://www.cocoachina.com/ios/20150126/...
    loveobjc閱讀 2,487評(píng)論 2 6
  • LLDB的Xcode默認(rèn)的調(diào)試器露久,它與LLVM編譯器一起,帶給我們更豐富的流程控制和數(shù)據(jù)檢測(cè)的調(diào)試功能欺栗。平時(shí)用Xc...
    CoderSC閱讀 1,351評(píng)論 0 2
  • 白百何這事還沒(méi)完毫痕。今天中午,全明星探曝出某知情人談白百何出軌的語(yǔ)音迟几。據(jù)該知情人語(yǔ)音爆料消请,白百何陳羽凡早在兩年半以前...
    魚(yú)樂(lè)圈沒(méi)有圈閱讀 155評(píng)論 0 5