Xcode開發(fā)常用的斷點(diǎn)調(diào)試命令?

『導(dǎo)言』

iOS利用Xcode進(jìn)行Debug調(diào)試的技巧很多,比如最常見的方式是打印Log,在一些工程中處處可見NSLog。還有就是打斷點(diǎn)Debug方式等。諸如此類,下面就自己在開發(fā)過程中常用的Xcode調(diào)試技巧簡單的做個(gè)總結(jié)。(斷點(diǎn)調(diào)試demo下載
聲明: 此文僅為我個(gè)人理解,有不正確的地方請(qǐng)?zhí)岢鰧氋F的意見建議!謝謝!

一、Xcode調(diào)試技巧之:NSLog

在OC語言中,打Log是采用NSLog方法。但是NSLog效率低下,可以打印出具體位置方法:(調(diào)試輸出Debug.h文檔下載


#ifdef DEBUG
#define DLog(fmt, ...) NSLog((@"[文件名:%s]\n" "[函數(shù)名:%s]\n" "[行號(hào):%d] \n" fmt), __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__);
#define DeBugLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
#define NSLog(...) NSLog(__VA_ARGS__);
#define MyNSLog(FORMAT, ...) fprintf(stderr,"[%s]:[line %d行] %s\n",[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__, [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
#else
#define DLog(...)
#define DeBugLog(...)
#define NSLog(...)
#define MyNSLog(FORMAT, ...)
#endif
  • 注意:release版本中應(yīng)該要去掉NSLog
  • 例如:
  • 代碼
    NSArray *array = @[@"wo",@"shi",@"apple"];
    DLog(@"打印數(shù)組%@",array);
  • 打印結(jié)果(類名+方法+行號(hào)+打印內(nèi)容
2017-03-31 17:08:23.730 控制臺(tái)調(diào)試[20594:350839] [文件名:/Users/zhaowenjuan/Desktop/êé??à??è∞?∞é???/êé??à??è∞?∞é???/ViewController.m]
[函數(shù)名:-[ViewController touchesBegan:withEvent:]]
[行號(hào):43] 
打印數(shù)組(
    wo,
    shi,
    apple
)
圖.DLog輸出邏輯分析
二、Xcode調(diào)試技巧之:LLDB
  • 斷點(diǎn)調(diào)試執(zhí)行命令:
序號(hào) 命令 說明 翻譯 范圍
1 c/continue goto next breakpoint; 去執(zhí)行下一個(gè)斷點(diǎn) 斷點(diǎn)
2 n/next step over 跳到某個(gè)斷點(diǎn)方法內(nèi)部 斷點(diǎn)內(nèi)
3 s/step step into 跳到某個(gè)斷點(diǎn)內(nèi)部的下一個(gè)位置 斷點(diǎn)內(nèi)
4 finish step out 退出某個(gè)斷點(diǎn)內(nèi)部的位置 斷點(diǎn)內(nèi)
  • 斷點(diǎn)執(zhí)行命令示例圖:


    斷點(diǎn)執(zhí)行圖標(biāo).gif

    斷點(diǎn)執(zhí)行.gif
  • 斷點(diǎn)調(diào)試打印命令
序號(hào) 命令 說明 舉例子
1 po print object的縮寫,表示顯示對(duì)象的文本描述,如果對(duì)象不存在則打印nil 命令:po num</br>輸出 :8
2 p 打印基本數(shù)據(jù)類型 命令:p i</br>輸出:(int) $0 = 30
3 call 執(zhí)行一段代碼</br>一般只在不需要顯式輸出,或是無返回值時(shí)使用call,用于動(dòng)態(tài)調(diào)試插入調(diào)用代碼 命令:call NSLog(@"%@", @"zwj")
4 expr 動(dòng)態(tài)執(zhí)行指定表達(dá)式 命令:expr i = 101</br>輸出:(int)$0 = 101
5 bt 打印當(dāng)前線程堆棧信息;<br /><br />如果要打印所有線程堆棧信息,使用:bt all即可。 \
6 image 常用來尋找棧地址對(duì)應(yīng)代碼位置:行號(hào) 例如:<br />NSArray *array = @[@"yang",@"she",@"bing"];NSLog(@"%@",array[3]);</br><br />命令輸入:<br />image lookup --address 0x0000000104c25550 </br><br />輸出:<br />Address: 控制臺(tái)調(diào)試[0x000000010000145a] (控制臺(tái)調(diào)試.__TEXT.__text + 1178) </br>Summary: 控制臺(tái)調(diào)試</br>-[ViewController touchesBegan:withEvent:] + 1178 at ViewController.m:43 </br><br /> 重點(diǎn)代碼:<br />image lookup --address
斷點(diǎn)輸出命令-OK.gif
  • 補(bǔ)充:命令image
    • 問題:命令image,如何來尋找棧地址對(duì)應(yīng)代碼具體位置?(根據(jù)地址找到類中的位置,如行標(biāo)line
  • 例如: 應(yīng)用場景(數(shù)組越界)模擬代碼:
NSArray *array = @[@"yang",@"she",@"bing"];
NSLog(@"%@",array[3]);

錯(cuò)誤信息如下:

2017-03-31 18:17:24.200 控制臺(tái)調(diào)試[21406:433320] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayI objectAtIndex:]: index 3 beyond bounds [0 .. 2]'
*** First throw call stack:
(
    0   CoreFoundation                      0x000000010f86ed4b __exceptionPreprocess + 171
    1   libobjc.A.dylib                     0x000000010f2d021e objc_exception_throw + 48
    2   CoreFoundation                      0x000000010f7a92bb -[__NSArrayI objectAtIndex:] + 155
    3   êé??à??è∞?∞é???                     0x000000010ecfb44a -[ViewController touchesBegan:withEvent:] + 1178
    4   UIKit                               0x000000010fea9f6b forwardTouchMethod + 348
    5   UIKit                               0x000000010fea9dfe -[UIResponder touchesBegan:withEvent:] + 49
    6   UIKit                               0x000000010fd02285 -[UIWindow _sendTouchesForEvent:] + 2043
    7   UIKit                               0x000000010fd03c33 -[UIWindow sendEvent:] + 4011
    8   UIKit                               0x000000010fcb09ab -[UIApplication sendEvent:] + 371
    9   UIKit                               0x000000011049d72d __dispatchPreprocessedEventFromEventQueue + 3248
    10  UIKit                               0x0000000110496463 __handleEventQueue + 4879
    11  CoreFoundation                      0x000000010f813761 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
    12  CoreFoundation                      0x000000010f7f898c __CFRunLoopDoSources0 + 556
    13  CoreFoundation                      0x000000010f7f7e76 __CFRunLoopRun + 918
    14  CoreFoundation                      0x000000010f7f7884 CFRunLoopRunSpecific + 420
    15  GraphicsServices                    0x000000011365aa6f GSEventRunModal + 161
    16  UIKit                               0x000000010fc92c68 UIApplicationMain + 159
    17  êé??à??è∞?∞é???                     0x000000010ecfb83f main + 111
    18  libdyld.dylib                       0x00000001126d068d start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

這個(gè)時(shí)候我們?nèi)绻麘岩沙鲥e(cuò)的地址是0x000000010ecfb44a,那么我們可以使用下面命令來找出錯(cuò)誤代碼的位置:

image lookup --address 0x000000010ecfb44a

執(zhí)行命令后輸出結(jié)果如下:

(lldb) image lookup --address 0x000000010ecfb44a
      Address: 控制臺(tái)調(diào)試[0x000000010000144a] (控制臺(tái)調(diào)試.__TEXT.__text + 1178)
      Summary: 控制臺(tái)調(diào)試`-[ViewController touchesBegan:withEvent:] + 1178 at ViewController.m:43
斷點(diǎn)輸出命令-崩潰.gif
  • 結(jié)果分析:從上面輸出結(jié)果中可以看出,錯(cuò)誤位置應(yīng)該是ViewController.m文件中的第43行。
  • 鏈接:

1 .iOS開發(fā)之Xcode常用調(diào)試技巧總結(jié)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評(píng)論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,556評(píng)論 3 418
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評(píng)論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評(píng)論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,778評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,218評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,436評(píng)論 0 288
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,969評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,795評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,993評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,229評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評(píng)論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,687評(píng)論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,990評(píng)論 2 374

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

  • 當(dāng)你寫一個(gè)應(yīng)用程序,你將不可避免地犯錯(cuò)誤。 更糟糕的是,您的應(yīng)用程序設(shè)計(jì)中會(huì)時(shí)不時(shí)地出現(xiàn)錯(cuò)誤。 Xcode 的調(diào)試...
    titvax閱讀 701評(píng)論 0 0
  • 最近在面試,面試過程中問到了一些Xcode常用的調(diào)試技巧問題。平常開發(fā)過程中用的還挺順手的,但你要突然讓我說,確實(shí)...
    遠(yuǎn)0閱讀 640評(píng)論 2 8
  • NSLog,po命令和普通斷點(diǎn)調(diào)試相信每個(gè)iOS開發(fā)者都會(huì),這里就不作介紹了。 一、Memory Graph Xc...
    wu大維閱讀 12,209評(píng)論 16 187
  • LLDB的Xcode默認(rèn)的調(diào)試器,它與LLVM編譯器一起,帶給我們更豐富的流程控制和數(shù)據(jù)檢測(cè)的調(diào)試功能。平時(shí)用Xc...
    CoderSC閱讀 1,374評(píng)論 0 2
  • 你是否曾經(jīng)苦惱于理解你的代碼,而去嘗試打印一個(gè)變量的值? NSLog(@"%@", whatIsInsideThi...
    木易林1閱讀 964評(píng)論 0 4