ACCESSiOS 开发之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

……

……

……

ACCESS,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、条件断点

打上断点之后,对断点举行编辑,设置相应过滤条件。上面简单的牵线一下规则设置:

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类中的view威尔Appear方法就搁浅执行:

Symbol:[ViewController viewWillAppear:]即[类名
方法名]可以执行到指定类的指定方法中先河断点。尽管只有view威尔(Will)Appear:即方法名,它会举办到所以类中的view威尔Appear:方法中起先断点。

四、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)技巧总结

相关文章