iOS 开发之xcode常用调试技巧总结

日前于面试,面试过程被问到了一部分Xcode常用之调节技巧问题。平常开发进程被因故的尚好顺手的,但若如突然给我说,确实同面子懵逼。Debug的技能很多,比如最普遍的点子是自从只Log,在部分工程被处处可见NSLog。还有即使是打断点的Debug方式等。诸如此类,下面就和好在出过程遭到常用之Xcode调试技巧简单的开只总结。

同样、Xcode调试技巧的:NSLog

地方吧涉嫌了,在咱们日常的出过程被最好常见的Debug方式就是由Log。而在OC语言中,打Log是采取NSLog方法。但是NSLog效率低,所以当平常底开发过程被,能不从Log就非从Log。实在想打Log网上为来指向NSLog的一部分优化措施,可以看王巍的《[宏定义的非官方魔法

宏菜鸟起飞手册](https://link.jianshu.com?t=https://onevcat.com/2014/01/black-magic-in-macro/)》如下代码便出自其中:

#define NSLog(format, …) do {                                        
   

fprintf(stderr, “<%s : %d> %s\n”,                                
         

[[[NSString stringWithUTF8String:__FILE__] lastPathComponent]
UTF8String],  

__LINE__, __func__);                                            
           

(NSLog)((format), ##__VA_ARGS__);                                
         

fprintf(stderr, “——-\n”);                                          
   

} while (0)

除此以外在使NSLog的早晚应该注意,release版本中当要错过丢NSLog。

第二、Xcode调试技巧的:LLDB

1、po:print
object的缩写,表示显示对象的文件描述,如果目标非在则打印nil。

简短的打印一个靶我们即便不说了,我们的话说特别的使用场景吧!

利用场景:你想掌握一个视图包含了怎样子视图。当然你可以循环打印子视图,但是下就待一个下令即可缓解。

出口视图层级关系(这是一个让埋伏的命):po [[self view]
recursiveDescription]

还发生只广大的调节场景,比如您若打印一个model。你一直用NSLog或po对象处理的结果是model的地方,这并无是我们想只要之。怎么收拾?有无产生缓解方式也?

答案是一些。你得还写model里面的description方法。但是,如果model里属性很多,这样就是未适用了。你不可能说于description方法中拼接属性返回。这样不光辛苦,而且可读性非常不同。到此,我们可以应用runtime动态获取属性并返。不过我并无建议您再写description方法,我引进而又写debugDescription方法(至于详细的牵线与哪些还写请点击这里),因为debugDescription方法与description方法效果一样,区别在于debugDescription方法是以公使用po命令时调用的,实际上也是调用了description方法。

2、p:可以就此来打印基本数据列。

3、call:执行同样段落代码

call NSLog(@”%@”, @”yang”)

4、expr:动态执行指定表达式

expr i = 101

输出:(int)$0 = 101

5、bt:打印当前线程堆栈信息

假定只要打印所以线程堆栈信息,使用:bt all即可。

6、image:常用来寻觅栈地址对许代码位置:

选个栗子:

动场景(数组越界)模拟代码:

NSArray *array = @[@”yang”,@”she”,@”bing”];

NSLog(@”%@”,array[3]);

错误信息如下:

*** Terminating app due to uncaught exception ‘NSRangeException’,
reason: ‘*** -[__NSArrayI objectAtIndex:]: index 3 beyond bounds
[0 .. 2]’

*** First throw call stack:

(

0  CoreFoundation                      0x000000010579734b
__exceptionPreprocess + 171

1  libobjc.A.dylib                    0x00000001051f821e
objc_exception_throw + 48

2  CoreFoundation                      0x00000001056d1eeb
-[__NSArrayI objectAtIndex:] + 155

3  BGMultimediaDemo                    0x0000000104c25550
-[ViewController viewDidLoad] + 192

4  UIKit                              0x0000000105d5c06d
-[UIViewController loadViewIfRequired] + 1258

……

……

……

21  BGMultimediaDemo                    0x0000000104c25adf main + 111

22  libdyld.dylib                      0x000000010857268d start + 1

23  ???                                0x0000000000000001 0x0 + 1

)

libc++abi.dylib: terminating with uncaught exception of type NSException

本条时咱们设怀疑出错的地址是0x0000000104c25550,那么我们可使用下发号施令来索来错误代码的位置:

image lookup –address 0x0000000104c25550

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

Address: BGMultimediaDemo[0x0000000100001550]
(BGMultimediaDemo.__TEXT.__text + 192)

Summary: BGMultimediaDemo`-[ViewController viewDidLoad] + 192 at
ViewController.m:30

从今地方输出结果遭到得以看到,错误位置应该是ViewController.m文件被的30尽。是免是极品好用?反正自己认为好用。

老三、Xcode调试技巧的:断点(Breakpoint)

断点,程序员Debug必备技之一。

1、条件ACCESS断点

自及断点之后,对断点进行编辑,设置相应过滤条件。下面简单的介绍一下准绳设置:

Condition:返回一个布尔值,当布尔值为真触发断点,一般里面我们可以写一个表达式。

Ignore:忽略前N软断点,到N+1浅还沾发断点。

Action:断点触发事件,分为六种:

AppleScript:执行脚本。

Capture GPU Frame:用于OpenGL ES调试,捕获断点处GPU当前打制帧。

Debugger Command:和控制台中输入LLDB调试命令一致。

Log Message:输出自定义格式信息到控制台。

Shell Command:接收命令文件和相应参数列表,Shell
Command是异步执行的,只有勾选“Wait until
done”才会待Shell命令执行完毕在实行调试。

Sound:断点触发时播放声音。

这些力量平时在调试程序的长河中都得以展开尝试,说实话我于是的装置Condition项会较多把。

Options(Automatically continue after evaluating
actions选项):选中后,表示断点不会见终止程序的周转。

2、异常断点

好断点可以快捷稳定不满足特定条件的老大,比如大规模的数组越界,这时候很为难通过大信息定位及左所在位置。这个上大断点就可以发挥作用了。

增长非常断点:

编纂好断点:

Exception:可以择撇下来怪对象类型:OC或C++。

Break:选择断点接收的弃来十分来是Throw还是Catch语句。

3、符号断点

标志断点的缔造方式以及特别断点一样一样的,在符号断点中可指定要暂停执行的法门:

选个例子,常见的场面,我怀念被它实施及ViewController类中之viewWillAppear方法就是暂停执行:

Symbol:[ViewController viewWillAppear:]即[类名
方法名]可履到指定类的指定方法中开始断点。如果只有viewWillAppear:即方法名,它见面执行到用类似中之viewWillAppear:方法被初步断点。

季、Xcode调试技巧的:EXC_BAD_ACCESS

1、开启僵尸对象

展Zombie模式下会招致内存上升,因为用就让保释(引用计数为0)的靶子吃僵尸对象取代,并未真的假释掉。这个时段重新受僵尸对象发送信息,就见面废弃来怪,并打印出非常信息,你可以轻松的找到错误代码位置,结束Zombies时会自由。它的重要性成效是检测野指针调用。

运方式:

“Edit Scheme…” —> “Run” —> “Diagnostics” —> “Zombie Objects”

打开”Edit Scheme…”窗口:

开启Zombie模式:

小心:Zombie模式不克还真机上动,只能以模拟器上采取。

2、Address Sanitizer(地址消毒剂)

当Xcode7之后新增了AddressSanitizer工具,为咱调试EXC_BAD_ACCESS错误提供了便民。当次创建变量分配一段落外存时,将以此内存后面的平截内存也冻结住,标识为中毒内存。程序访问到中毒内存时(访问越界),立即暂停程序,抛来深并打印好信息。你得依据中断位置和出口的Log信息来解决错误。当然,如果变量已经出狱了,它所占用的内存为会见吃标识也中毒内存,这个时刻访问这片内存空间同样会扔来大。

下办法:

“Edit Scheme…” —> “Run” —> “Diagnostics” —> “Zombie Objects”

开启AddressSanitizer之后,在调试程序的过程中,如果起遇到EXC_BAD_ACCESS错误,程序则会自动终端,抛来很。

五、结语

文中提到的这些不过是iOS开发过程被于泛的平局部Debug方式。其他的还有像:Profile,Analyze分析,View
Hierarchy(在调节视图显示大时用底可比多)等,有趣味之可以活动了解。

正文内容中有起源网络,后续会不断更新完善。欢迎并学学交流!

如需转载,请注明出处:iOS开发的Xcode常用调试(Debug)技巧总结

相关文章