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

1. 打印

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

//swift版

func DLog<T>(message: T, file: String = #file, method: String = #function, line: Int = #line) {

#if DEBUG

print("<\((file as NSString).lastPathComponent) : \(line)>, \(method)  \(message)")

#endif

}

//OC版

#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

LLDB的Xcode默认的调试器, 我们通过执行LLDB命令使调试过程更加的灵活。

Xcode内嵌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

brew update

brew install chisel

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

# ~/.lldbinit

...

command script import /path/to/fblldb.py

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

命令

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

5. 界面调试利器: Reveal

Reveal 绝对是iOS界面调试利器。只要用上一次你就会离不开它。

安装

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;

5, 然后选中Build Settings 在搜索栏中输入 Other Linker Flags。选中Other Linker Flags

在Other Linker Flags中输入下面代码 : -ObjC -lz -framework Reveal

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集成到你项目中时就会认识到它的威力。

iOS高效调试的更多相关文章

  1. iOS各种调试技巧豪华套餐

    转载自http://www.cnblogs.com/daiweilai/p/4421340.html 目录 前言 逼优鸡 知己知彼 百战不殆 抽刀断Bug 普通操作 全局断点(Global Break ...

  2. IOS各种调试

    IOS各种调试技巧豪华套餐   目录 前言逼优鸡知己知彼 百战不殆抽刀断Bug 普通操作 全局断点(Global BreakPoint) 条件断点(Condational Breakpoints)打印 ...

  3. 一些iOS高效开源类库

    因为iOS SDK相对比较底层,所以开发者就得受累多做一些体力活.不过幸运的是,有很多第三方的类库可以用来简化很多不必要的工作.笔者整理了一下在本人学习过程中用到的一些比较有用Objective-C开 ...

  4. iOS崩溃调试的使用和技巧总结

    在iOS开发调试过程中以及上线之后,程序经常会出现崩溃的问题.简单的崩溃还好说,复杂的崩溃就需要我们通过解析Crash文件来分析了,解析Crash文件在iOS开发中是比较常见的. 现在网上有很多关于解 ...

  5. Xamarin.iOS模拟器调试找不到资源文件

    Xamarin.iOS模拟器调试找不到资源文件 在Visual Studio 2015中,运行Xamarin.iOS项目,出现找不到资源文件的错误.错误信息:System.IO.FileNotFoun ...

  6. iOS 程序调试、测试方案

    1. iOS 之 界面调试 2. iOS 之 调试.解决BUG 3. iOS 程序测试.程序优化.提交前检测

  7. ios浏览器调试踩坑(1)----mescroll.js和vue-scroller

    主要记录在ios浏览器出现触摸无限加载的情况 使用vue-scroller和mescroll.js/mescroll.vue先踩ios浏览器默认滑动会影响mescroll的方法调用. 首先给公共js加 ...

  8. IOS模拟器调试ANE

    来源:http://www.tuicool.com/articles/AFRJzi 利用iOS模拟器来检测和调试AIR应用程序补充篇 Air3.4来了 除去可以直接往模拟器里面部署应用,还可以往真机里 ...

  9. iOS 高效灵活地配置可复用视图组件的主题

      本文首发于 Ficow Shen's Blog,原文地址: iOS 高效灵活地配置可复用视图组件的主题.   内容概览 前言 如何配置主题? 如何更高效地配置主题? 面向协议/接口的方案     ...

随机推荐

  1. Redis的一些坑

    转载请注明出处哈:http://carlosfu.iteye.com/blog/2254154 上上周和同事(龙哥)参加了360组织的互联网技术训练营第三期,美团网的DBA负责人侯军伟给大家介绍了美团 ...

  2. C++关键字:mutable(转)

    参考:http://blog.csdn.net/hxz_qlh/article/details/14475573 修饰成员变量,在const成员函数中可修改它,在C++中还从未用过这个关键字.

  3. Codeforces Gym 100114 D. Selection

    Description 问选择一个序列上的所有数的最少操作次数,跟电脑上选择文件一样,输出操作方案. Sol 贪心. 用Shift一段文件只能使用一次,之后必须一直按Ctrl了. 然后就是看用Shif ...

  4. 解决 QtCreator 3.5(4.0)无法输入中文的问题

    解决 QtCreator 3.5.1无法输入中文的问题 [TOC] 环境是ubuntu 15.10 ubuntu软件源中下载安装的fctix-libs-qt5现在没有用,版本太旧了. 自己下载fcti ...

  5. 36 网络相关函数(四)——live555源码阅读(四)网络

    36 网络相关函数(四)——live555源码阅读(四)网络 36 网络相关函数(四)——live555源码阅读(四)网络 简介 7)createSocket创建socket方法 8)closeSoc ...

  6. Arlenmbx!!!!

    我无限制的以安逸为想法 其实生活的不安逸 我所做的事情和思路到底正不正确? 我失败了? 我做不到? 我尝试做到? 我可以做到! 我能做到 我做到了我已经做到了 难道想法和现实是有区别的吗 有理想只是空 ...

  7. Apache Thrift 服务开发框架学习记录

    Apache Thrift 是 Facebook 实现的一种高效的.支持多种编程语言的远程服务调用的框架. 前言: 目前流行的服务调用方式有很多种,例如基于 SOAP 消息格式的 Web Servic ...

  8. 【自动部署】Ansible 怎么通过堡垒机/跳板机 访问目标机器

    Ansible机器的 /root/.ssh/config 配置如下即可:Host 目标机器IP User root IdentityFile=/root/.ssh/xxx_id_rsa ProxyCo ...

  9. CSS3 text-overflow 属性

    1. <!DOCTYPE html> <html> <head> <style> div.test { white-space:nowrap; widt ...

  10. ios NSString 转 float的注意

    今天有一个字符串 “33.3”,用想用[valueString floatValue];得到33.3000这个值,结果得到了33.2999这个值,取前3位一个是33.3,一个是33.2,产生了错误,应 ...