iOS高效调试
写代码难免出现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高效调试的更多相关文章
- iOS各种调试技巧豪华套餐
转载自http://www.cnblogs.com/daiweilai/p/4421340.html 目录 前言 逼优鸡 知己知彼 百战不殆 抽刀断Bug 普通操作 全局断点(Global Break ...
- IOS各种调试
IOS各种调试技巧豪华套餐 目录 前言逼优鸡知己知彼 百战不殆抽刀断Bug 普通操作 全局断点(Global BreakPoint) 条件断点(Condational Breakpoints)打印 ...
- 一些iOS高效开源类库
因为iOS SDK相对比较底层,所以开发者就得受累多做一些体力活.不过幸运的是,有很多第三方的类库可以用来简化很多不必要的工作.笔者整理了一下在本人学习过程中用到的一些比较有用Objective-C开 ...
- iOS崩溃调试的使用和技巧总结
在iOS开发调试过程中以及上线之后,程序经常会出现崩溃的问题.简单的崩溃还好说,复杂的崩溃就需要我们通过解析Crash文件来分析了,解析Crash文件在iOS开发中是比较常见的. 现在网上有很多关于解 ...
- Xamarin.iOS模拟器调试找不到资源文件
Xamarin.iOS模拟器调试找不到资源文件 在Visual Studio 2015中,运行Xamarin.iOS项目,出现找不到资源文件的错误.错误信息:System.IO.FileNotFoun ...
- iOS 程序调试、测试方案
1. iOS 之 界面调试 2. iOS 之 调试.解决BUG 3. iOS 程序测试.程序优化.提交前检测
- ios浏览器调试踩坑(1)----mescroll.js和vue-scroller
主要记录在ios浏览器出现触摸无限加载的情况 使用vue-scroller和mescroll.js/mescroll.vue先踩ios浏览器默认滑动会影响mescroll的方法调用. 首先给公共js加 ...
- IOS模拟器调试ANE
来源:http://www.tuicool.com/articles/AFRJzi 利用iOS模拟器来检测和调试AIR应用程序补充篇 Air3.4来了 除去可以直接往模拟器里面部署应用,还可以往真机里 ...
- iOS 高效灵活地配置可复用视图组件的主题
本文首发于 Ficow Shen's Blog,原文地址: iOS 高效灵活地配置可复用视图组件的主题. 内容概览 前言 如何配置主题? 如何更高效地配置主题? 面向协议/接口的方案 ...
随机推荐
- RFM
前面博客中讲到的聚类,聚类是对客户的一些特征进行分群,属于描述,不涉及客户价值的判断,然而在营销中,其实第一步应该是搞清楚谁才是你的关键客户,哪些用户的价值较高,这就需要用到RFM模型.RFM模型是众 ...
- DOM之节点层次
1.1 Node类型 DOM1级定义了一个Node接口,该接口将由DOM中的所有节点类型实现.这个Node接口在JS中是作为Node类型实现的:除了IE之外,其他浏览器可访问这个类型.JS中的所有节点 ...
- Java实现读取文件夹下(包括子目录)所有文件的文件名
在编程的过程中,经常会用到对文件的读写操作等.比如,找出某一个文件夹下的所有文件名等. 下面的程序给出了,获取某一给定文件夹下所有文件的绝对路径的程序.可以作为某一个模块,在需要的时候直接使用. pa ...
- 2015安徽省赛 H.数7
http://xcacm.hfut.edu.cn/problem.php?id=1212 模拟大发 #include<iostream> #include<cstdio> #i ...
- ZJOIDay2T1 BB题解
讲道理我是调不出来了... 考虑对序列按下标维护每个节点最后的树. 那么 改操作点 - 把一段连续的节点改父亲 加点/删点(注意拆成两个操作了) 插儿子 那么用seg维护一下下标, 用ETT维护Dep ...
- SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data
在用php返回json数据的时候如果出现这种错误,先检查一下php中是否有使用var_dump()函数 这个函数会在页面输出测试变量的结构,浏览器会将这个当做json数据,所以就报错了....
- SQL Server 2008 R2 Developer (x86, x64, ia64) – DVD (Chinese-Simplified)
http://blog.sina.com.cn/s/blog_4aedf6370101j9tz.html 1. SQL Server 2008 R2 Developer (x86, x64, ia64 ...
- Git对象模型
原文:http://gitbook.liuhui998.com/1_2.html 一.SHA 在git中,所有用来表示项目历史信息的文件,是通过一个40个字符的(40-digit)"对象名& ...
- SQL Server OBJECT_ID() 函数
OBJECT_ID 返回架构范围内对象的数据库对象标识号. 重要提示 使用 OBJECT_ID 不能查询非架构范围内的对象(如 DDL 触发器).对于在 sys.objects 目录视图中找不到的对象 ...
- 【leetcode】Word Ladder II
Word Ladder II Given two words (start and end), and a dictionary, find all shortest transformation ...