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

1477988250339451.png

Symbol:[ViewController viewWillAppear:]即[类名
方法名]可以举行到指定类的指定方法中开端断点。假设只有view威尔(Will)Appear:即方法名,它会执行到所以类中的view威尔Appear:方法中起始断点。

4、监控断点
咱俩调试程序的大部分时候都是为着监控某个变量的成形,在代码中变量出现的地点添加断点不仅累而且还可能漏掉,事后还得一个一个删掉,实在很累。
俺们可以透过为变量添加监控断点来简单地做到这一点。找到变量第一回出现的地点,添加一个家常断点,进入
debug 情势后在 Variables View 中右键变量,采用 沃特(Wat)ch
变量名。这样,每一回该变量被改爱丁堡会触发断点告知大家。

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技巧

相关文章