iOS高效调试

转自:http://blog.csdn.net/lg_codemachine/article/details/52605283


1. 打印


最简单,基础的调试方法就是打印日志了。贴出两段封装好的日志打印代码:

<code class="swift"><span class="hljs-comment" style="color: rgb(136, 0, 0);">//swift版</span>
<span class="hljs-func"><span class="hljs-keyword" style="color: rgb(0, 0, 136);">func</span> <span class="hljs-title">DLog</span><span class="hljs-generics"><T></span><span class="hljs-params" style="color: rgb(102, 0, 102);">(message: T, file: String = #file, method: String = #function, line: Int = #line)</span></span> { 
    #<span class="hljs-keyword" style="color: rgb(0, 0, 136);">if</span> <span class="hljs-type">DEBUG</span> 
        <span class="hljs-built_in" style="color: rgb(102, 0, 102);">print</span>(<span class="hljs-string" style="color: rgb(0, 136, 0);">"<<span class="hljs-subst" style="color: rgb(0, 0, 0);">\((file <span class="hljs-keyword" style="color: rgb(0, 0, 136);">as</span> NSString)</span>.lastPathComponent) : <span class="hljs-subst" style="color: rgb(0, 0, 0);">\(line)</span>>, <span class="hljs-subst" style="color: rgb(0, 0, 0);">\(method)</span>  <span class="hljs-subst" style="color: rgb(0, 0, 0);">\(message)</span>"</span>)
    #endif
}

<span class="hljs-comment" style="color: rgb(136, 0, 0);">//OC版</span>
#ifdef <span class="hljs-type">DEBUG</span>
     #define <span class="hljs-type">DLog</span>(fmt, ...) <span class="hljs-type">NSLog</span>((@<span class="hljs-string" style="color: rgb(0, 136, 0);">"<%s : %d> %s  "</span> fmt), [[[<span class="hljs-type">NSString</span> stringWithUTF8String:<span class="hljs-keyword" style="color: rgb(0, 0, 136);">__FILE__</span>] lastPathComponent]   <span class="hljs-type">UTF8String</span>], <span class="hljs-keyword" style="color: rgb(0, 0, 136);">__LINE__</span>, __PRETTY_FUNCTION__,  ##__VA_ARGS__);
#<span class="hljs-keyword" style="color: rgb(0, 0, 136);">else</span>
    #define <span class="hljs-type">DLog</span>(...)
#endif</code>

eg:

<code class="objectivec"><span class="hljs-comment" style="color: rgb(136, 0, 0);">//在AppDelegate.m中调用下面的方法</span>
- (<span class="hljs-keyword" style="color: rgb(0, 0, 136);">void</span>)applicationDidFinishLaunching:(<span class="hljs-built_in" style="color: rgb(102, 0, 102);">UIApplication</span> *)application{
    DLog(<span class="hljs-string" style="color: rgb(0, 136, 0);">@"hello world"</span>);
}
<span class="hljs-comment" style="color: rgb(136, 0, 0);">//打印结果: 2016-09-18 17:19:27.931 DateCell[2901:1622220] <AppDelegate.m : 54> -[AppDelegate applicationDidFinishLaunching:]  hello world</span></code>

2. 断点


(1)普通断点

普通断点是调试中最常使用的。当程序运行到断点处就会暂停运行。其设置方法非常简单:在需要设置断点的代码行的左侧单击即可。


普通断点

(2)条件断点(为断点添加条件和其他属性,暂且就称它条件断点)

条件断点是在普通断点的基础上添加了判断条件。当程序执行到断点处,并且满足设置的条件时断点才会有效。设置方法如下:


打开断点编辑框

这里写图片描述

在上面的设置中,条件断点的条件是 i==3, 那么在整个循环中只有在i=3时程序才会在断点处停止执行。
在 Edit Breakpoint...窗口中有下面四个输入项:

  • Condition 设置的条件。
  • Ignore 表示忽略多少次之后断点有效。例如:不设置条件,Ignore设置为4,则i=4时程序在断点处停止。
  • Action 在程序断点处执行的操作(执行完这个操作后代码停止运行,此时设置断点处的代码还没有执行)。这里的操作是LLDB语句,关于LLDB会在下面介绍。
  • Options 当选中时,执行完Action的操作后代码不会停止,就像没有设置断点一样。

(3)异常断点Exception BreakPoint

在设置异常断点的情况下 当程序crash时 Xcode会帮我们定位到crash产生的位置。


没有异常断点的情况

设置异常断点的情况

设置异常断点步骤:


这里写图片描述

(4)符号断点Symbolic Breakpoint

符号断点能够为某一个方法或者 某一个类的某一个方法设置断点。实现的功能如下图:


某一个类的某一个方法设置断点

在某个方法中执行断点

设置步骤如下:


符号断点设置步骤

3. LLDB


LLDB的Xcode默认的调试器, 我们通过执行LLDB命令使调试过程更加的灵活。
Xcode内嵌LLDB调试窗口。在程序执行到断点后你可以输入LLDB命令操作调试过程。


LLDB调试窗口

LLDB常用命令如下:

1, po (print object)输出对象, 如 po [self view];
2, p (print)用于输出基本类型, 如 p (int)[[[self view] subviews] count] 输出子视图个数。
3, expr (expression) 可以在调试时动态执行指定表达式,并将结果打印出来。常用于在调试过程中修改变量的值。例如上图所示,程序第一次执行到断点时
执行下面的指令:expr i=4
你会看到如下的输出: (int) $0 = 4
继续运行程序,程序输出的信息是:value:4 i==4
4, call call即是调用的意思。其实上述的po和p也有调用的功能。因此一般只在不需要显示输出,或是方法无返回值时使用call。我们可以在viewDidLoad:里面设置断点,然后在程序中断的时候输入下面的命令: call [self.view setBackgroundColor:[UIColor redColor]] 此时view的背景颜色变为红色。
5, bt 打印调用堆栈,加all可打印所有thread的堆栈。不详细举例说明,感兴趣的朋友可以自己试试。
6, fr v -R 命令来打印出变量的未加工过时的信息

如果想了解更详细的内容,戳这里。

4. Chisel


Chisel是 facebook开源的用于界面调试的lldb命令。

安装

Chisel 使用 homebrew 来安装,如果你没有安装homebrew, 参考 homebrew

<code class="sql">brew <span class="hljs-operator"><span class="hljs-keyword" style="color: rgb(0, 0, 136);">update</span>
brew <span class="hljs-keyword" style="color: rgb(0, 0, 136);">install</span> chisel</span></code>

安装完成后,在~/.lldbinit 中添加如下内容, 没有~/.lldbinit则新建。

<code class="bash"><span class="hljs-comment" style="color: rgb(136, 0, 0);"># ~/.lldbinit</span>
...
<span class="hljs-built_in" style="color: rgb(102, 0, 102);">command</span> script import /path/to/fblldb.py</code>

重启Xcode, 此时Chisel就可以使用了。

命令


命令集合

英语不好的同学可以看这里。

5. 界面调试利器: Reveal


Reveal 绝对是iOS界面调试利器。只要用上一次你就会离不开它。对于Reveal的介绍可以去官网了解。

安装

Reveal是收费的,提倡正版。下面的破解版只供教学使用,不可用于生产环境。

1, 从官网下载Reveal并安装;
2,下载破解文件 提取密码:7x48;
3,破解步骤见破解文件中的使用说明。
4, 打开Reveal,开始使用。Reveal的新版本可能修改验证逻辑,如果没有破解成功那就使用正版的吧。

在项目中配置

在使用Reveal之前需要对iOS项目进行简单配置,配置步骤如下:
1, 使用Xcode打开你想要查看UI的工程;

2, 打开Reveal,点击 Help → Show Reveal Library in Finder;


这里写图片描述

3,将Reveal.framework 拖入打开的Xcode工程.并点击完成;


这里写图片描述

4,点击Build Phases 然后从Link Binary With Libraries 删除Reveal.framework;


从Link Binary With Libraries 删除Reveal.framework

5, 然后选中Build Settings 在搜索栏中输入 Other Linker Flags。选中Other Linker Flags
在Other Linker Flags中输入下面代码 : -ObjC -lz -framework Reveal


配置 Other Linker Flags

6,运行模拟器,打开Reveal,链接模拟器。


链接模拟器

到此大功告成。接下来你就可以通过Reveal 对你的界面进行debug了。


效果

6. 调试工具集:FLEX


FLEX是Flipboard开源的一系列在应用中调试的工具集。FLEX以第三方库的形式集成在应用中,使用时将类库加到工程中,然后 通过调用[[FLEXManager sharedManager] showExplorer]; 就可显示出用于调试的工具栏进行调试。

它提供的功能如下:

  • 查看、修改views
  • 查看任何对象的属性
  • 动态的修改属性
  • 动态的调用实例方法和类方法
  • 查看网络请求过程
  • 添加模拟的键盘快捷键
  • 查看系统日志
  • 从堆中获取任何对象
  • 查看沙盒中的文件
  • 查看文件系统中的SQLite/Realm数据库
  • 在模拟器中触发3D touch
  • 查看你应用中所有的类
  • 快速获取常用的类,例如[UIApplication sharedApplication], the app delegate, the root view controller on the key window, and more.
  • 动态的查看NSUserDefaults里面的值

简直吊炸天。当你将FLEX集成到你项目中时就会认识到它的威力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值