Xcode开发常用的断点调试命令?

『导言』

iOS利用Xcode进行Debug调试的技巧很多,比如最常见的方式是打印Log,在一些工程中处处可见NSLog。还有就是打断点Debug方式等。诸如此类,下面就自己在开发过程中常用的Xcode调试技巧简单的做个总结。(断点调试demo下载
声明: 此文仅为我个人理解,有不正确的地方请提出宝贵的意见建议!谢谢!

一、Xcode调试技巧之:NSLog

在OC语言中,打Log是采用NSLog方法。但是NSLog效率低下,可以打印出具体位置方法:(调试输出Debug.h文档下载


#ifdef DEBUG
#define DLog(fmt, ...) NSLog((@"[文件名:%s]\n" "[函数名:%s]\n" "[行号:%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版本中应该要去掉NSLog
  • 例如:
  • 代码
    NSArray *array = @[@"wo",@"shi",@"apple"];
    DLog(@"打印数组%@",array);
  • 打印结果(类名+方法+行号+打印内容
2017-03-31 17:08:23.730 控制台调试[20594:350839] [文件名:/Users/zhaowenjuan/Desktop/ÊéßÂà∂Âè∞Ë∞ÉËØï/ÊéßÂà∂Âè∞Ë∞ÉËØï/ViewController.m]
[函数名:-[ViewController touchesBegan:withEvent:]]
[行号:43] 
打印数组(
    wo,
    shi,
    apple
)
图.DLog输出逻辑分析
二、Xcode调试技巧之:LLDB
  • 断点调试执行命令:
序号 命令 说明 翻译 范围
1 c/continue goto next breakpoint; 去执行下一个断点 断点
2 n/next step over 跳到某个断点方法内部 断点
3 s/step step into 跳到某个断点内部的下一个位置 断点
4 finish step out 退出某个断点内部的位置 断点
  • 断点执行命令示例图:


    断点执行图标.gif

    断点执行.gif
  • 断点调试打印命令
序号 命令 说明 举例子
1 po print object的缩写,表示显示对象的文本描述,如果对象不存在则打印nil 命令:po num</br>输出 :8
2 p 打印基本数据类型 命令:p i</br>输出:(int) $0 = 30
3 call 执行一段代码</br>一般只在不需要显式输出,或是无返回值时使用call,用于动态调试插入调用代码 命令:call NSLog(@"%@", @"zwj")
4 expr 动态执行指定表达式 命令:expr i = 101</br>输出:(int)$0 = 101
5 bt 打印当前线程堆栈信息;<br /><br />如果要打印所有线程堆栈信息,使用:bt all即可。 \
6 image 常用来寻找栈地址对应代码位置:行号 例如:<br />NSArray *array = @[@"yang",@"she",@"bing"];NSLog(@"%@",array[3]);</br><br />命令输入:<br />image lookup --address 0x0000000104c25550 </br><br />输出:<br />Address: 控制台调试[0x000000010000145a] (控制台调试.__TEXT.__text + 1178) </br>Summary: 控制台调试</br>-[ViewController touchesBegan:withEvent:] + 1178 at ViewController.m:43 </br><br /> 重点代码:<br />image lookup --address
断点输出命令-OK.gif
  • 补充:命令image
    • 问题:命令image,如何来寻找栈地址对应代码具体位置?(根据地址找到类中的位置,如行标line
  • 例如: 应用场景(数组越界)模拟代码:
NSArray *array = @[@"yang",@"she",@"bing"];
NSLog(@"%@",array[3]);

错误信息如下:

2017-03-31 18:17:24.200 控制台调试[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

这个时候我们如果怀疑出错的地址是0x000000010ecfb44a,那么我们可以使用下面命令来找出错误代码的位置:

image lookup --address 0x000000010ecfb44a

执行命令后输出结果如下:

(lldb) image lookup --address 0x000000010ecfb44a
      Address: 控制台调试[0x000000010000144a] (控制台调试.__TEXT.__text + 1178)
      Summary: 控制台调试`-[ViewController touchesBegan:withEvent:] + 1178 at ViewController.m:43
断点输出命令-崩溃.gif
  • 结果分析:从上面输出结果中可以看出,错误位置应该是ViewController.m文件中的第43行。
  • 链接:

1 .iOS开发之Xcode常用调试技巧总结

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容

  • 当你写一个应用程序,你将不可避免地犯错误。 更糟糕的是,您的应用程序设计中会时不时地出现错误。 Xcode 的调试...
    titvax阅读 644评论 0 0
  • 最近在面试,面试过程中问到了一些Xcode常用的调试技巧问题。平常开发过程中用的还挺顺手的,但你要突然让我说,确实...
    远0阅读 623评论 2 8
  • NSLog,po命令和普通断点调试相信每个iOS开发者都会,这里就不作介绍了。 一、Memory Graph Xc...
    wu大维阅读 12,128评论 16 187
  • LLDB的Xcode默认的调试器,它与LLVM编译器一起,带给我们更丰富的流程控制和数据检测的调试功能。平时用Xc...
    CoderSC阅读 1,334评论 0 2
  • 你是否曾经苦恼于理解你的代码,而去尝试打印一个变量的值? NSLog(@"%@", whatIsInsideThi...
    木易林1阅读 952评论 0 4