您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  要资料 文章 文库 Lib 视频 Code iProcess 课程 认证 咨询 工具 火云堂 讲座吧   成长之路  
会员   
 
   
 
  
每天15篇文章
不仅获得谋生技能
更可以追随信仰
 
 
     
   
 订阅
  捐助
iOS高效调试
 
来源:iOS大全 发布于: 2017-2-7
303 次浏览     评价:      
 

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

1. 打印

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

//swift版 
func DLog(message: T, file: String = #file,
method: String = #function, line: Int = #line) {
#if DEBUG
print(", \(method) \(message)")
#endif
}

//OC版
#ifdef DEBUG
#define DLog(fmt, ...) NSLog((@" %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 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 命令来打印出变量的未加工过时的信息

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

http://lldb.llvm.org/tutorial.html

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就可以使用了。

命令

命令集合

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

https://blog.cnbluebox.com/blog/2015/03/05/chisel/

5. 界面调试利器: Reveal

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

安装

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

1, 从官网(https://revealapp.com/)下载Reveal并安装;

2,下载破解文件(https://pan.baidu.com/s/1bNPhlO) 提取密码:7×48;

3,破解步骤见破解文件中的使用说明。

4, 打开Reveal,开始使用。Reveal的新版本可能修改验证逻辑,如果没有破解成功那就使用正版的吧。

在项目中配置

在使用Reveal之前需要对iOS项目进行简单配置。

配置方法1:

Reveal可以使用cocoa pods导入:在Podfile文件中导入 pod ‘Reveal’, ‘~> 1.3’。

配置方法

如果不使用cocoa pods,配置起来略有麻烦。下面是详细的配置过程:

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

结语

上面介绍了六种调试方法,开发时可以根据具体情况选用最合适的调试方法。

   
 订阅
  捐助
 
相关文章

手机软件测试用例设计实践
手机客户端UI测试分析
iPhone消息推送机制实现与探讨
Android手机开发(一)
 
相关文档

Android_UI官方设计教程
手机开发平台介绍
android拍照及上传功能
Android讲义智能手机开发
相关课程

Android高级移动应用程序
Android系统开发
Android应用开发
手机软件测试
 

android人机界面指南
Android手机开发(一)
Android手机开发(二)
Android手机开发(三)
Android手机开发(四)
iPhone消息推送机制实现探讨
手机软件测试用例设计实践
手机客户端UI测试分析
手机软件自动化测试研究报告
更多...   


Android高级移动应用程序
Android应用开发
Android系统开发
手机软件测试
嵌入式软件测试
Android软、硬、云整合


领先IT公司 android开发平台最佳实践
北京 Android开发技术进阶
某新能源领域企业 Android开发技术
某航天公司 Android、IOS应用软件开发
阿尔卡特 Linux内核驱动
艾默生 嵌入式软件架构设计
西门子 嵌入式架构设计
更多...   
 
 
 

 
 
每天2个文档/视频
扫描微信二维码订阅
订阅技术月刊
获得每月300个技术资源
 
 

关于我们 | 联系我们 | 京ICP备10020922号 京公海网安备110108001071号