Xcode调试巧 | Lemtter 

JerryXia 发表于 , 阅读 (0)
Enable NSZombie Objects (开启僵尸对象)

首先打开 Edit Scheme
Edit Scheme

再选中 Enable Zombie Objects

Edit Scheme Detail

开启僵尸对象会容易观察到被重复释放的对象,即使在 ARC 项目中也会经常发生对象被重复释放引起的 Crashs,编绎器会让重复释放的象的调试信息更加直观

给所有异常添加(Global BreakPoint)全局断点

一般情况在应用崩溃时Xcode喜欢直接跳到main 函数中去,以至于应用到底在哪个地方崩了不是很直观.global breakpoint可以在应用调试时在抛出异常的地方直接添加断点,这样就可以捕获异常的具体的异常信息. 添加方法如下:

exception

Static Analyzer 静态分析

Static Analyzer是一个非常好的工具去发现编译器警告不会提示的问题和一些个人的内错泄露和死存储(不会用到的赋了值的变量)错误。这个方法可能大大的提高内存使用和性能,以及提升应用的整体稳定性和代码质量。

怎么打开Static Analyzer?打开Xcide的Product菜单,选择Analyzer选项,Static Analyzer会捕获任何应用内的可能的问题然后以蓝色的警告展示出来.

Condational Breakpoints(条件断点)

最后一个调试技巧条件断点,这只是普通的断点,当变量满足一定条件时程序停止。这个调试技巧在当你想要捕获一个循环中的变量的特定值或者一些不常发生的情况时是非常有用的,而不用你每次迭代都停止来查看。

怎样开启条件变量?只不过是添加一个普通断点,然后右键点击断点选择Edit Breakpoint,这时就打开了一个断点编辑器,你可以在这里设置断点条件(以及一些其他的断点设置),然后选择Done,这个调试技巧非常简单吧。

condition_breakpoint

unrecognized selector send to instancd 快速定位

在Debug菜单中 Breakpoints->Create Symbolic Breakpoint

SymbolicBreakPointSymbolic中填写如下方法签名

1
-[NSObject(NSObject)doesNotRecognizeSelector:]

SymbolicBreakPointEdit

设置完成后再遇到类似的错误就会定位到具体的代码。

NSLog 不打印设置

在xcode中开发时经常会添加一些打印信息,这些打印信息在模拟器中通常不会有什么影响,因为模拟器用的是 mac的硬件资源.当跑在真机中时过多的打印信息就会影响到性能了.除此之外打印信息也会暴露出一些应用的敏感信息.因此区分调试与正式应用的打印设置就非常有必要了.

实现原理

在-Prefix.pch(pch全称是”precompiled header”,也就是预编译头文件,该文件里存放的工程中一些不常被修改的代码,比如常用的框架头文件,这样做的目的提高编译器编译速度。我们知道当我们修改一个工程中某个文件代码时候,编译器并不是重新编译所有所有文件,而是编译改动过文件的,假如pch中某个文件修改了,那么pch整个文件里包含的的其他文件也会重新编译一次,这样就会消耗大量时间,所以它里面添加的文件最好是是很少变动或不变动的头文件或者是预编译的代码片段;)文件中添加

1
2
3
4
5
6
7
#ifdef DEBUG
#define NSLog(...) NSLog(__VA_ARGS__)
#define debugMethod() NSLog(@"%s", __func__)
#else
#define NSLog(...)
#define debugMethod()
#endif

上段代码的意思就是用宏指令做一个判断,如果DEBUG为真,则编译#ifdef到#endif宏定义,否则编译器就不编译;在 xcode6以后新建工程就不会自动生prefix.pch 文件了,所以我们可以新建一个pch文件来添加以上代码.另外还要将新创建的PCH file的路径添加到building setting中的precompile header(Apple LLVM 7.0 - Language)选项中去,注意debug和release两栏都要添加:

perfixheader

如何设置

“Target > Build Settings > Preprocessor Macros > Debug” 里有一个 “DEBUG=1”
nslog_macro

设置为Debug模式下,Product–>Scheme–>SchemeEdit Scheme设置Build ConfigurationDebug 时,就可以打印nslog了。设置Release,发布app版本的时候就不会打印了,提高了性能

nslog