iOS开发之Xcode常用调试(Debug)技巧总结
一、Xcode调试技巧之:NSLog
上面也提到了,在我们日常的开发过程中最常见的Debug方式就是打Log。而在OC语言中,打Log是采用NSLog方法。但是NSLog效率低下,具体原因可以看这篇博客(NSLog效率低下的原因及尝试lldb断点打印Log)。所以在平时的开发过程中,能不打Log就不打Log。实在想打Log网上也有对NSLog的一些优化方法,可以阅读王巍的《宏定义的黑魔法 - 宏菜鸟起飞手册》如下代码便出自其中:
|
另外在使用NSLog的时候应当注意,release版本中应该要去掉NSLog。
二、Xcode调试技巧之:LLDB
1、po:print object的缩写,表示显示对象的文本描述,如果对象不存在则打印nil。
简单的打印一个对象我们就不说了,我们来说说特殊的应用场景吧!
应用场景:你想知道一个视图包含了哪些子视图。当然你可以循环打印子视图,但是下面只需要一个命令即可解决。
输出视图层级关系(这是一个被隐藏的命令):po [[self view] recursiveDescription]
还有个常见的调试场景,比如你要打印一个model。你直接用NSLog或po对象处理的结果是model的地址,这并不是我们想要的。怎么办?有没有解决方法呢?
答案是有的。你可以重写model里面的description方法。但是,如果model里属性非常多,这样就不适用了。你不可能说在description方法里面拼接属性返回。这样不仅麻烦,而且可读性非常差。到这里,我们可以利用runtime动态获取属性并返回。不过我并不建议你重写description方法,我推荐你重写debugDescription方法(至于详细的介绍以及如何重写请点击此处),因为debugDescription方法和description方法效果一样,区别在于debugDescription方法是在你使用po命令时调用的,实际上也是调用了description方法。
2、p:可以用来打印基本数据类型。
3、call:执行一段代码
call NSLog(@"%@", @"yang")
4、expr:动态执行指定表达式
expr i = 101
输出:(int)$0 = 101
5、bt:打印当前线程堆栈信息
如果要打印所以线程堆栈信息,使用:bt all即可。
6、image:常用来寻找栈地址对应代码位置:
举个栗子:
应用场景(数组越界)模拟代码:
|
错误信息如下:
|
这个时候我们如果怀疑出错的地址是0x0000000104c25550,那么我们可以使用下面命令来找出错误代码的位置:
image lookup --address 0x0000000104c25550
执行命令后输出结果如下:
|
从上面输出结果中可以看出,错误位置应该是ViewController.m文件中的30行。是不是超级好用?反正我觉得好用。
三、Xcode调试技巧之:断点(Breakpoint)
断点,程序员Debug必备技之一。
1、条件断点
打上断点之后,对断点进行编辑,设置相应过滤条件。下面简单的介绍一下条件设置:
Condition:返回一个布尔值,当布尔值为真触发断点,一般里面我们可以写一个表达式。
Ignore:忽略前N次断点,到N+1次再触发断点。
Action:断点触发事件,分为六种:
- AppleScript:执行脚本。
- Capture GPU Frame:用于OpenGL ES调试,捕获断点处GPU当前绘制帧。
- Debugger Command:和控制台中输入LLDB调试命令一致。
- Log Message:输出自定义格式信息至控制台。
- Shell Command:接收命令文件及相应参数列表,Shell Command是异步执行的,只有勾选“Wait until done”才会等待Shell命令执行完在执行调试。
- Sound:断点触发时播放声音。
这些功能平时在调试程序的过程中都可以进行尝试,说实话我用的设置Condition项会较多些。
Options(Automatically continue after evaluating actions选项):选中后,表示断点不会终止程序的运行。
2、异常断点
异常断点可以快速定位不满足特定条件的异常,比如常见的数组越界,这时候很难通过异常信息定位到错误所在位置。这个时候异常断点就可以发挥作用了。
添加异常断点:
编辑异常断点:
Exception:可以选择抛出异常对象类型:OC或C++。
Break:选择断点接收的抛出异常来源是Throw还是Catch语句。
3、符号断点
符号断点的创建方式和异常断点一样一样的,在符号断点中可以指定要中断执行的方法:
举个例子,常见的场景,我想让它执行到ViewController类中的viewWillAppear方法就中断执行:
Symbol:[ViewController viewWillAppear:]即[类名 方法名]可以执行到指定类的指定方法中开始断点。如果只有viewWillAppear:即方法名,
它会执行到所以类中的viewWillAppear:方法中开始断点。
四、Xcode调试技巧之:EXC_BAD_ACCESS
1、开启僵尸对象
开启Zombie模式之后会导致内存上升,因为所以已经被释放(引用计数为0)的对象被僵尸对象取代,并未真的释放掉。这个时候再给僵尸对象发送消息,
就会抛出异常,并打印出异常信息,你可以轻松的找到错误代码位置,结束Zombies时会释放。它的主要功能是检测野指针调用。
使用方法:
“Edit Scheme…” —> “Run” —> “Diagnostics” —> “Zombie Objects”
打开”Edit Scheme…”窗口:
开启Zombie模式:
注意:Zombie模式不能再真机上使用,只能在模拟器上使用。
2、Address Sanitizer(地址消毒剂)
在Xcode7之后新增了AddressSanitizer工具,为我们调试EXC_BAD_ACCESS错误提供了便利。当程序创建变量分配一段内存时,将此内存后面的一段内存也冻结住,
标识为中毒内存。程序访问到中毒内存时(访问越界),立即中断程序,抛出异常并打印异常信息。你可以根据中断位置及输出的Log信息来解决错误。当然,
如果变量已经释放了,它所占用的内存也会被标识为中毒内存,这个时候访问这片内存空间同样会抛出异常。
使用方法:
“Edit Scheme…” —> “Run” —> “Diagnostics” —> “Zombie Objects”
开启AddressSanitizer之后,在调试程序的过程中,如果有遇到EXC_BAD_ACCESS错误,程序则会自动终端,抛出异常。
五、结语
文中提到的这些只是iOS开发过程中比较常见的一部分Debug方式。其他的还有比如说:Profile,Analyze分析,View Hierarchy(在调试视图显示异常时用的比较多)等,
有兴趣的可以自行了解。
本文内容中部分来自网络,后续会不断更新完善。欢迎一起学习交流!
六、参考博客地址:
- iOS 开发调试技巧
- 与调试器共舞 - LLDB 的华尔兹
- Xcode7新特性AddressSanitizer
- 在Xcode 7上直接使用Clang Address Sanitizer
- Xcode 调试技巧
- Xcode Debug技巧
iOS开发之Xcode常用调试(Debug)技巧总结的更多相关文章
- iOS开发之Xcode常用调试技巧总结
转载自:iOS开发之Xcode常用调试技巧总结 最近在面试,面试过程中问到了一些Xcode常用的调试技巧问题.平常开发过程中用的还挺顺手的,但你要突然让我说,确实一脸懵逼.Debug的技巧很多,比如最 ...
- iOS开发之 Xcode 5 下让你的应用在不同状态(debug, release)有不同的图标
http://nickcheng.com/post/unique-icons-for-your-app-in-different-state-in-xcode5-debug-release 应用在发布 ...
- iOS开发之Xcode常见错误
一."file/file.h" file not found 如果遇到这种类型的问题报错,可以分为三部来解决,由简到复杂一步一步来,直到解决问题位置.1. 点击Xcode -> ...
- 李洪强iOS开发之Xcode快捷键
14个Xcode中常用的快捷键操作 在Xcode 6中有许多快捷键的设定可以使得你的编程工作更为高效,对于在代码文件中快速导航.定位Bug以及新增应用特性都是极有效的. 当然,你戳进这篇文章的目的 ...
- iOS开发之Xcode 6更新默认不支持armv7s架构
最近一次的Xcode 6更新默认不再支持arm7s架构,究竟是要废除不用呢还是仅仅只是一个疏忽? 目前的Xcode 6配置里定义${ARCHS_STANDARD}为armv7, arm64,当然这个定 ...
- IOS开发之xcode 快捷键
IOS开发也有一年多了,发现Xcode快捷键,还不熟,恶补一下.要不然真影响工作效率,呵呵! 1. 文件 CMD + N: 新文件 CMD + SHIFT + N: 新项目 CMD + O: 打开 C ...
- iOS开发之Xcode 相对路径与绝对路径
iOS开发之 相对路径与绝对路径 https://developer.apple.com/library/mac/documentation/DeveloperTools/Reference/Xcod ...
- iOS开发之Xcode 如何使用API帮助
内容转载自<iOS开发指南 2.6.2 如何使用API帮助> 对于一个初学者来说,学会在Xcode中使用API帮助文档是非常重要的.下面我们通过一个例子来介绍API帮助文档的用法.在编写H ...
- iOS开发之 Xcode 6 创建一个Empty Application
参考链接http://jingyan.baidu.com/article/2a138328bd73f2074b134f6d.html Xcode 6 正式版如何创建一个Empty Applicatio ...
随机推荐
- hdu 5112 (2014北京 水)
题意:有个人在跑步,一直每个时间他所在的位置,求最大速度 #include <iostream> #include <cstring> #include <cstdio& ...
- 容器化分布式日志组件ExceptionLess的Angular前端UI
写在前面 随着微服务架构的流行,日志也需要由专门的分布式日志组件来完成这个工作,我们项目使用的是 ExceptionLess 这个组件,它是前后端分离的:这篇文章我们就来实践容器化 Exception ...
- JQuery when() done() then()
jQuery.when(deferreds) 参数deferreds,一个或多个延时对象或JS对象,我们初略的认为它就是一个或多个异步请求. 例如:$.when($.ajax("page1. ...
- Hibernate查询多个数据
Query query = session.createQuery("from Table");//表名首字母大写 query.setFirstResult(0); //从第一个开 ...
- vue开发中遇到的问题集锦(2)
1,在搭建了一个vue的脚手架之后,写了第一个组件,路由也已经配置完毕,且页面的路由显示是:http://localhost:8080/#/userLogin,userLogin里面有内容,但是页面显 ...
- 58. Length of Last Word(easy, 字符串问题)
Given a string s consists of upper/lower-case alphabets and empty space characters ' ', return the l ...
- 百度音乐flac 下载
破解百度音乐白金会员 为了给Play Music上传标签齐全的正版的mp3,本屌翻遍网络苦思冥想.现在终于被我找到了破解之法——破解百度白金会员!破解之后可以直接从百度下载正版授权的320k文件,更可 ...
- C++/C# 开发高级案例资料一次送!关注加群领取哦!
目前C/C++.C#.JAVA等语言开发的在线教育比较火爆,但小编所见的讲解高级案例的非常少,切合市场需求的较少.而且针对铁路.公路.建筑.市政.制造业等所有工业计算机辅助设计的开发技术和案例几乎没有 ...
- Hive中yyyymmdd和yyyy-mm-dd日期之间的切换
以2017-12-05和20171205相互转换为例说明 方法1: from_unixtime+ unix_timestamp --20171205转成2017-12-05 ','yyyymmdd') ...
- map函数、filer函数、reduce函数的用法和区别
Map函数 map函数的用法如下: def add_one(x): return x+1 #使用普通函数 v1 = map(add_one,[1,2,3]) v1 = list(v1) print(v ...