ACCESSiOS开发之Xcode常用调试技巧总结

NSLog,po命令和一般性断点调试相信每个iOS开发者都见面,这里虽不发介绍了。

一、Memory Graph

Xcode8新增:Memory Graph解决闭包引用循环问题

斯时候就是进入了断点模式,可以查issue面板,注意选择右边Runtime:

发生无数叹号说明就是有问题了。看内存中object的讳,有同样修是Closure captures
leaked。展开后点击就可以看到之issue对应之内存图形展示在中的面板中。当然矣,我们重多的当儿是以debug页面下查看:

故,这间引用循环了。点击紫色的叹号会油然而生Xcode分析出来的内存引用图形:

来了此图就是杀轻看下了:这里发生只援循环

附带取一下,通过在Arguments中安装参数,打印出App加载的时长,包括总体加载时长,动态库加载时长等。

在Environment
Variables中添加DYLD_PRINT_STATISTICS字段,并安装为YES,在控制台就见面打印加载时长。

Edit Scheme

HYbfCQTYAJMgAkw

其次、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、条件断点
于及断点之后,对断点进行编辑,设置相应过滤条件。下面简单的介绍一下原则设置:
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选项):选中后,表示断点不会见终止程序的运转。

1477988185595536.jpg

2、异常断点
老断点可以快捷稳定不满足特定条件的不可开交,比如大规模的数组越界,这时候很不便通过杀信息一定到左所在位置。这个时段怪断点就足以发挥作用了。
增长颇断点:

1477988201696957.jpg

编制好断点:

1477988213410670.jpg

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

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

3、符号断点
符断点的创方式和充分断点一样同等的,在符号断点中可以指定要中断执行之章程:
推个例证,常见的气象,我思念叫她实施及ViewController类中的viewWillAppear方法就搁浅执行:

1477988250339451.png

Symbol:[ViewController viewWillAppear:]即[类名
方法名]足尽及指定类的指定方法吃起断点。如果只有viewWillAppear:即方法名,它见面实施及用类似吃的viewWillAppear:方法被初露断点。

4、监控断点
俺们调试程序的绝大多数辰光都是为了监控有变量的扭转,在代码中变量出现的地方补充加断点不仅累又还可能漏掉,事后尚得一个一个删掉,实在挺烦。
咱俩可通过为变量添加监控断点来概括地完成就一点。找到变量第一浅出现的地方,添加一个常见断点,进入
debug 模式继每当 Variables View 中右键变量,选择 Watch
变量名。这样,每一样不良该变量被转移都见面触发发断点告知我们。

2016-08-17_Screen Shot 2016-08-17 at 23.55.10.png

季、Xcode调试技巧的:EXC_BAD_ACCESS
1、开启僵尸对象
打开Zombie模式下会招致内存上升,因为用已经被放飞(引用计数为0)的靶子吃僵尸对象取代,并未真的放飞掉。这个上重新于僵尸对象发送信息,就见面丢弃来怪,并打印出非常信息,你可以轻松的找到错误代码位置,结束Zombies时会见放出。它的关键功效是检测野指针调用。
动办法:
“Edit Scheme…” —> “Run” —> “Diagnostics” —> “Zombie Objects”
打开”Edit Scheme…”窗口:

1477988279182828.png

开启Zombie模式:

1477988284639020.png

只顾:Zombie模式不能够再真机上运用,只能于模拟器上行使。
2、Address Sanitizer(地址消毒剂)
于Xcode7之后新增了AddressSanitizer工具,为咱调试EXC_BAD_ACCESS错误提供了福利。当次创建变量分配一截外存时,将以此内存后面的相同段落内存也冻结住,标识为中毒内存。程序访问到中毒内存时(访问越界),立即暂停程序,抛来深并打印好信息。你得依据中断位置与出口的Log信息来解决错误。当然,如果变量已经出狱了,它所占据的内存为会见让标识也中毒内存,这个时节访问这片内存空间同样会扔来深。
利用办法:
“Edit Scheme…” —> “Run” —> “Diagnostics” —> “Address
Sanitizer”

1477988306785766.png

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

3.Analyze分析器
Analyze分析器是千篇一律种静态的工具,可以本着我们的主次开展剖析,找有我们无利用的变量,或部分老存储。执行Analyze如下:Product–>Analyze.
如下蓝色的记就是静态分析的结果。

当然,我们得装在编译程序的时段以Analyze,把下列选项设为Yes即可。

5、视图调试

当今iOS开发之UI设计出大多种方,比如storyboard,xib,代码实现。对于stoayboard,xib可视化实现是比较简单的,但是于部分“iOS老程序员”而言,都爱不释手下代码实现UI,并且可能UI层次还比较复杂。这样即便为咱新接项目之开发者带来多困扰。如何快速查看一个复杂UI的界面层次与布局,最抢的道就是为此到视图调试。
当型运行到某某一个界面(可以是模拟器或真机)时,开启视图调试,点击按钮如图:

如此即使见面进去待调试,你得十分有益的查这界面。这里可以视控件之间的层次关系。

六、参考博客地址:
instruments这里不开牵线,请参见:
instruments来检验而的app
Memory Graph
iOS 开发调试技巧

每当Xcode 7上直接运用Clang Address
Sanitizer

Xcode
调试技巧

Xcode
Debug技巧

相关文章