iOS高效调试

写代码难免出现bug储备些调试技能绝对能够提高你的工作效率,让bug无所遁形。下面就和大家分享一些我在工作中常用的iOS调试小技能。

1. 打印

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

#ifdef DEBUG

#define DLog(fmt, ...) NSLog((@"<%s : %d> %s  " fmt), [[[NSString stringWithUTF8String:__FILE__] lastPathComponent]   UTF8String], __LINE__, __PRETTY_FUNCTION__,  ##__VA_ARGS__);

#else

#define DLog(...)

#endif

eg:

//在AppDelegate.m中调用下面的方法

- (void)applicationDidFinishLaunching:(UIApplication *)application{

DLog(@"hello world");

}

//打印结果: 2016-09-18 17:19:27.931 DateCell[2901:1622220] <AppDelegate.m : 54> -[AppDelegate applicationDidFinishLaunching:]  hello world

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

LLDBXcode默认的调试器,我们通过执行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即是调用的意思。其实上述的pop也有调用的功能。因此一般只在不需要显示输出,或是方法无返回值时使用call。我们可以在viewDidLoad:里面设置断点,然后在程序中断的时候输入下面的命令: call [self.view setBackgroundColor:[UIColor redColor]] 此时view的背景颜色变为红色。

5, bt 打印调用堆栈,加all可打印所有thread的堆栈。不详细举例说明,感兴趣的朋友可以自己试试。

6 fr v -R 命令来打印出变量的未加工过时的信息

如果想了解更详细的内容,http://lldb.llvm.org/tutorial.html

4. Chisel

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

安装

Chisel 使用 homebrew 来安装,如果你没有安装homebrew, 参考http://brew.sh

brew update

brew install chisel

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

# ~/.lldbinit

...

command script import /path/to/fblldb.py

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

命令

命令集合

英语不好的同学可以看https://blog.cnbluebox.com/blog/2015/03/05/chisel/

5. 界面调试利器:Reveal

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

安装

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

1https://revealapp.com下载Reveal并安装;

2, 下载破解文件https://pan.baidu.com/share/init?shareid=3490432084&uk=2620796126提取密码: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

FLEXFlipboard开源的一系列在应用中调试的工具集。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集成到你项目中时就会认识到它的威力。

结语

上面介绍了六种调试方法,开发时可以根据具体情况选用最合适的调试方法。如果本博文对你有帮助就送个喜欢吧。

 

iOS调试的更多相关文章

  1. Xamarin.iOS调试提示需要iOS SDK

    Xamarin.iOS调试提示需要iOS SDK   错误信息:The version of Xamarin.iOS requires th iOS 9.3 SDK (shipped with Xco ...

  2. iOS 调试心得

    修复 bug 占用我们日常开发的大部分时间,熟练的使用调试工具可以给我们节约大部分的时间. LLDB 的常用命令 expression expresion 是一个非常常用的命令,我们可以通过这个命令来 ...

  3. iOS 调试 crash breakpoint EXC_BAD_ACCESS SIGABRT

    原文地址:iOS 调试 crash breakpoint EXC_BAD_ACCESS SIGABRT作者:流年若离殇 在调试程序的时候,总是碰到crash的bug,而且一追踪就是一些汇编的代码,让人 ...

  4. 提高Android和iOS调试编译速度

    http://www.cnblogs.com/findumars/p/7841252.html 提高Android和iOS调试编译速度   如果您使用Delphi开发App,就会遇到:Android和 ...

  5. uniapp - 关于ios调试

    [ios调试] 1.一台windows电脑.一根apple数据线(一旦连接以后,apple设备就会自动识别itunes软件,如果没有安装会提示) 2.安装itunes (爱思助手) 3.官方教程:ht ...

  6. [转] iOS SDK:iOS调试技巧

    原文:  http://www.cocoachina.com/ios/20130517/6225.html 为什么你的数组包含3个项目而不是5个?为什么你的游戏运行缓慢?这些都跟调试有关,调试是开发过 ...

  7. [ios-必看] IOS调试技巧:当程序崩溃的时候怎么办 iphone IOS

    from:http://article.ityran.com/archives/1143 有这样一种情形:当我们正在快乐的致力于我们的app时,并且什么看都是无比顺利,但是突然,坑爹啊,它崩溃了.(悲 ...

  8. iOS调试踩过的坑 以及instruments使用指南

    1. 低版本的XCode工程中包含的lib,在高版本的XCode中会编译错误,提示找不到库,故需要恢复libC++库到原位置上,参考 https://github.com/devdawei/libst ...

  9. iOS 调试大法

    本文转载至 http://www.jianshu.com/p/d19e19a91071 0.笨办法 看变量.对象?NSLog+重新编译运行:改某对象?改源码+重新编译运行:隔离某个方法?在方法中写 r ...

随机推荐

  1. angular(3)服务 --注入---自定义模块--单页面应用

    ng内部,一旦发生值改变操作,如$scope.m=x,就会自动轮询$digest队列,触发指定的$watch,调用其回调函数,然后修改dom树. 干货:https://github.com/xufei ...

  2. selenium查找动态的iframe的name

    WebElement frame1 = driver.findElement(By.xpath("/html/body/div[9]/div[2]/div/iframe"));dr ...

  3. Mysql zip格式安装

    1.下载 文件 2.解压 3.配置环境变量D:\common files\MySqlServer\bin 4.修改配置文件 D:\common files\MySqlServer\my-default ...

  4. spark1.3编译过程中遇到的一个坑

    在编译spark1.3.0时: export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m&q ...

  5. http://paulgraham.com/arcfaq.html

    Why not use some other delimiter than parentheses?为什么不使用一些其他的分隔符比括号?We tried various possibilities. ...

  6. 通过WMI接口监控服务器性能

    WMI 是微软操作系统的一个内置的组件,通过使用WMI我们可以获取服务器硬件信息.收集服务器性能数据.操作Windows服务,甚至可以远程关机或是重启服务器. 一.在C#编程中使用WMI 要想在C#程 ...

  7. python多线程和多进程对比

    1.多线程:开启一个进程test.py ,占用两个cpu  共占用45%左右(top -c ,按1)  多进程:开启两个进程test.py 用两个cpu  90%*2左右 test.py # codi ...

  8. 关于NK3C使用富文本编辑器(CKEditor)发送HTML邮件的使用说明

     目前NK3C发送HTML邮件使用的的编辑器是CKEditor4.6版本,关于CKEditor的使用说明如下:   1.依赖JQuery1.7版本以上,在xxx.vm中<head>< ...

  9. Dev tdxDBTreeView

    可以快速的用tree展示层次结构,无需任何编码;对tree的操作会自动post到数据集:对数据集的操作会 在tree上表现 一.关键 设置 datasource displayField:节点的   ...

  10. 【转】Mac系统中安装homebrew(类似redhat|Centos中的yum;类似Ubuntu中的apt-get)

    Homebrew,Homebrew简称brew,是Mac OSX上的软件包管理工具,能在Mac中方便的安装软件或者卸载软件,可以说Homebrew就是mac下的apt-get.yum神器 Homebr ...