ACCESSiOS 项目调试

iOS 常用bug调试方法

普通操作

如图3

ACCESS 1

中央的断点操作如下

图4

 ACCESS 2

点击这么些黑列列就创办了一个断点,再一次点击即即撤这一个断点(可是不删),长论老断点拖出来就去了(mac
os的系统工程师就是稀饭拖动的快感),当然为可以右键那一个创制的断点,会弹来相应地菜单。
本为还可监视某个变量!
图5

ACCESS 3

于对象视图中,右键某个对象,点击“沃特ch ‘XXX’”就形成XXX对象的监视了。

此处自己监视了lab这些UILabel的变量,每当这些变量举办更新她的信息就碰面受打印至控制台。
哼吧!我们尽中心的创始断点的劳作曾学
会了,Xcode舒服在啊地方也?就是勿分开Debug格局及Run形式的,可以说凡是无缝切换的,你要没开创断点,那么即便是Run的常规形式,假设创立了断点并且运行至断点处,就活动进入Debug模式了,不像某EC开头的IDE,控制面板就比如开飞机的一模一样,几万只按钮以为生强劲,其实仅仅所以了Run和
Stop,还有什么Debug情势,App格局……,果然Xcode的优越感在自查自纠中越显明了,舒服到最点呀,就比如冬日的海风吹拂过菊花,嗯是的
就是这种痛感!
我们创制好了断点,运行及断点就自行截止下来了,像这样:
图6

ACCESS 4

这多少个Debug的相当基本操作技能是每一个入门的IOS开发者都设控制的,应该算平种本能,就如狗爱吃翔一样(噢
对不起
博主不是歧视狗的意,博主也养过狗,很二压然而尚未吃翔!真的据我所知它一贯不吃翔的,这里只是况只是况)。

 

大局断点(Global BreakPoint)

有时候在程序出错的时节不克会精确定位到奔溃的那么一行代码,而是直接走至main循环或者Appdelegate里面,
或者会让你这么的唤醒:

EXEC_BAD_ACCESS:

凡休是起种植想哭的兴奋?尼玛~至少给我有些仓库消息可以呀~……这几个时节你相对不要砸鼠标和键盘哦,一切都是主机在运转,你砸鼠标和键盘有啊用也?应该是踢主机呀~~,现在暴发了全局断点,娘亲再为未担心你砸鼠标了,你只是待如此:
图7

ACCESS 5

于Debug导航面板举办上图的操作,你便立了全局断点,这样一旦遭逢错误,debug程序就会自行定位到栈底的信息,也就是是您初出错的代码的那么一行,这样您不怕好喜的debug拉~~

 

规则断点(Condational Breakpoints)

既往发出一个游乐,叫做撸啊撸,有些玩家他们领会怎么操作,会放技能会履,可是他们无知晓买装备,玩了同一合作社下来,鞋子小刀片都未曾购进。我为什么讲是故事也?因为众多小孩学东西和玩游戏一样,看了前边的两种调试技能,就觉得自己早已屌爆无敌了,其实她们可是大凡外出不带装备的玩家,倘使只是要
用了上述之调试技能只好算得低玩,在伟大的逼优鸡面前根本就是会于须臾秒的这种,所以学会装备自己才是王道!条件断点,就是学会有的放矢!

大家来拘禁一样段子代码
图8

ACCESS 6

君是不是记挂咨询博主为啥那么浪漫,竟然达到了Swift了!!我此时独自想吟一首湿:旁人笑我最好好色,我家住在黄鹤楼。
左右是年代我们如故吃饱了支撑在的,博主也是,所以即便学习斯威夫特(Swift)(Swift)咯。
我们只要以一个巡回里用了断点,假若这多少个轮回执行了100万赖,这您的断点要履这累,你无看蛋蛋都凉了的忧伤伤么?所以我们这么做:
ACCESS,图9

ACCESS 7

诸如此类单暴发遍历到c==“H”的时光 断点才晤面吃触发。

图10

ACCESS 8

是无是非常硬呢!
多少童鞋的钛合金狗眼已经观望了编写断点这里有一个Action的东西,这是呀啊?
此是颇强的,可以当您断点的职,执行各个操作,比如执行下论命令,控制高命令(可以制定调试音讯自定义保存)、打印音讯等,
博主太欢喜的哪怕是者Log
message啦,简单粗暴!根本就是未待print啊NSLog嘛,直接当断点的Action打印就好了(其实是是Xcode和调试器结合的高能产物,上面再介绍)。具体可这么:
图11

ACCESS 9

事实上刚刚博主撒谎了,博主太喜爱的Action并无是Log
Message,而是Sound,顾名思义嘛,断点射在Bug上,那样际遇断点就会发出声音,听到我要好设置的声,我就通晓凡是啊Bug了,听声识
Bug,呵呵,EXEC_BAD_ACCESS的左我设置成了波多野先生的响声,unrecognized
selector send to instancd的不当我设置成了苍老师的……
不要问我系统怎么没吉泽明步的动静,我从不怕非明了哪个是吉泽明步。

当还有更加强有力的条件断点就是当时卖啦
图12

ACCESS 10

丰富下于 Symbol 一棚输入 viewDidLoad。
那样一来,在次中保有的 viewDidLoad 方法为调用时还会合沾发断点。
图13

ACCESS 11
本,我们吧得但为特定的某部类的方上加断点。在 Symbol 一苑输入
[ClassName viewDidLoad] (Objective-C) 或 ClassName.viewDidLoad (Swift)
即可。
仍:unrecognized selector sent to instance 0xaxxxx
这种似是而非,这一个instance能够如此连忙稳定
图14

ACCESS 12

 

 

打印的不二法门

即使ARC已经为内存管理变得简单、省时和飞跃,可是在object的life-cycles中跟踪一些重要事件仍旧相当重要。毕竟ARC并没有完
全排内存泄露的可能,或者拟访问一个被release的目的。为了是目的,大家好充裕艺术地窥见对象在召开来什么,想想就吓出快感。

NSLog

伴侣们率先节省课上ViewController的生命周期的上,老师肯定万分无聊的教了我们,在viewController的每个生命周期的
方法被使用了NSLog来窥探!没错,这样其实尽管是卓殊简便爆炸的跟踪生命周期的方了,然则系统协调之NSLog真心有点羸弱,输出的消息最少,根本就是非
能知足我们的欲念,这里自己教我们加深你的Log!!
可据此脚的当即段宏

//A better version of NSLog
#define NSLog(format, ...) do { \
fprintf(stderr, "<%s : %d> %s\n", \
[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], \
__LINE__, __func__); \
(NSLog)((format), ##__VA_ARGS__); \
fprintf(stderr, "-------\n"); \
} while (0)

 

关于大的威力 咱们好混入自己的博文
IOS中之预编译指令的先河探索》

如此打印出来的物才像话嘛(其实NSLog的打印是非凡低效的,甚至比print低100倍增,感兴趣自己翻翻苹果手册咯)。 
使objc语言(强类型)并且为此NSLog打印的时光,通常搞不清楚NSLog(@“%?”,xxx)
xxx这系列型该是什么什么类型输出,应该是%d呢如故%@亦可能%f???傻傻分不清楚~,所以玩转NSLog你当使清楚以下这几乎独全局方法!
图17

ACCESS 13

展僵尸对象(Enable NSZombie Objects)

Xcode可以将那几个曾经release掉得对象,变成“僵尸”,当咱们访问一个Zombie对象时,Xcode可以告诉我们正看的靶子是一个休应该在的对象了。因为Xcode知道这目的是啊,所以可以给我们了然此目的在哪,以及及时是什么时有的。
据此Zombies是您的好基友!他好于你输出的信息还切实!!
现实这样做:
图15

ACCESS 14
自己又尝试输出Object的音讯咯,是无是好过硬呢?
僵尸只好用在模拟器和OC语言哦~

 

击的码农

若果说若早已拿打印的形式以的风生水起了,并且断点的应用可随手拈来随便,那么你曾在和薄优鸡的对垒中,稳操大部分胜券了,你既是一个
孤高冷艳的程序员了,俯视一切低能的侵优鸡了!但是!面对再强有力的仇人——你这秃顶1000°近视牙齿夹着韭菜的发出在十年针迎战逼优鸡的同事面前、以及笑里
藏刀眼睛有眼屎不过能由此眼神杀死你的面试官……
对于他们,你要么尽死,你的技巧的磨砺还太少!所以您必要抢攻!!比逼优鸡还要强大的敌人出现了!我们要更强劲的枪杆子。

Console(lldb 命令)

我们的靶子是设武装及鼻毛!console窗口我们了然虽然是哪位黑乎乎好多字会滚下,尤其是深受压优鸡干到的当儿,那么同学等暴发没有来相逢那种console呢
图16

ACCESS 15
俺们家的编译器历史
敬请乱入 《IOS中的预编译指令的起先探索》 ,
没错我们现正用在世界上最为好的c、c++、oc、swift的编译器——LLVM,lldb就是者世界上顶好的LLVM的调试器!不要害羞,因为
大家是最好出彩的!所以肯定要由此极端好之!千万别客气哟,随便用,就像自己下相同啊,啊
哈哈 吃吃吃
别只顾着吃饭,多夹菜……哎~博主好客的职业病又作了~,什么?你无清楚当哪用lldb?
首先!你得先crash或者把程序断下来!直到你望图16之(lldb)字样出现,你虽然足以敲命令了~~
老是你想查看变量,常量,你若又勾NSLog去打印,然后又编译,去履行,重头初阶?太艰巨了,有矣lldb你一旦这么
图18

ACCESS 16

凡是未是好到爆炸?
当你生出一个switch语句,你以测试每一个case,你还设创立假条件去测试;有一个if…else…语句,你为测试不同的状,你假诺硬编码写了不同之情,编译好四回等以测试每种境况……,我思你该了然为何自己的发那么稀了。
如上的这个意况,只待一浅编译,使用lldb的thread命令,伪造再次回到值,欺骗寄存器,就能够随心所欲的做得了所有测试了。
是勿是牛逼到爆炸?
lldb真的老有力,博主没有骗而,这篇博文到是的有所调试技巧lldb都好实现,各样断点,各样打印,调用python插件,运行中断,操作硬件底层,控制程序运行线程……lldb都得以做到!仿佛lldb就是其他一个雄的社会风气!!!
凡是未是强硬到爆炸?
骨子里假设您不思贪多嚼不烂的语,你倘诺会那些调试工具,基本前边的调试技能你可不用学了,在那里博主也是勿才,lldb的无敌不是博主随便说几句子就足以表明的出的, 
再多地需要我们事必躬亲,才会真正体味至那种美好,这种称心快意无比的调试体验!
此处博主无私地打出任意门,这里出充分好的篇章!可以叫你好好的体味,呵呵
《The LLDB Debugger》
《About LLDB and
Xcode》

《LLDB调试命令初探》
《与调试器共舞 – LLDB 的华尔兹》

 

Profile(instruments)

 

图19

ACCESS 17
即刻独东西怎么翻译为?我们虽给检查器吧!!也许已经学习了IOS开发大多年之公,一向都尚未注意到或使用此家伙,可是博主很据总责之告诉您现在市面上别
一慢性好之APP都汇合以instruments来受代码更加健全!难道instrument是春药?怎么会使代码健壮呢?
以此敦实不是可怜健壮~哎~~ 我才18岁可以无克清纯一点呀

instrument里面含了成千上万工具,内存溢出分析,性能分析,各种分析……
如若细说的话,这多少个真的可以吗每个工具起初平首博客,但是博主是一个接头授人以鱼类勿苟授人以渔的理的始终驾驶员!所以博主当然不会面漫游说一样一体!大家虽然来经受在老
家看看专用debug的内存溢出分析工具的选用吧!
图20

ACCESS 18
在运用leaks在此之前我们可试试那“Analyze”
图21

ACCESS 19
analyze
可以便捷的发现你的代码中release的问题,以及连续过程被的父类方法缺失等等问题!一般一个上佳之IOS开发工程师No
Warning、Pass
Analyze是极端基本的品行!我通晓你早就对你自己之门类的成百上千独warning已经麻木了,但博主本人负责人地报你,这样糟糕!,因为发一致篇山东民
歌《老司机带带我》听得博主神清气爽!

遵从当IOS开发者的贞节!跟着我大喊口号!

No Warning!Pass Analyze!

咱延续回到使用leaks!倘诺analyze都通过了,那么就是好使leaks工具,发现本年老妖级别之侧漏了!
图22

ACCESS 20
假使提醒有一个目的来侧漏的高风险,你还好如此弹出侧边的展开细节
图23

ACCESS 21
直接点击方法就是足以一向进入代码有了!!
大凡休是颇粗略粗暴也罢!当然还多其它工具,然而叫做篇幅的物总是限制人数,诶
真蛋疼~真的还怀念多说接触之 
牵记使再度多领悟instrument 咱们可以看看这首作品!
《How to Use Instruments in
Xcode》

 

Xcode视图调试

偶尔小逼优鸡隐藏的较充裕,代码几乎都翻了单周,依旧不曾找到题目来当啊,博主可以解这种风中烂,蛋碎一地的赶脚,因为许多独昼夜博主就是深
陷当中不能自拔,后来干脆直接还新建一个工程!依旧好!!我失去,直到暴发一致龙博主上午起来,看到镜子中友好帅气的脸蛋,我才猛然清醒,原来增长得好好得那样急迅的找到bug!最后锁定是讨人喜欢而丑的xib和storyboard出了问题!!某个constraint或者view的嵌套逻辑又或组织合作
Git争辩等等问题,导致io
-v什么的荒谬,这种情状去检查视图文件,可能xcode崩溃打不上马好xib或者storyboard,你一贯以文本工具打开那些xml类型的标志文
件,你差点吐血,几万推行之记录狗眼都看瞎了……。

而是这历史要让收!!因为我们强大的xcode的视图调试功用!!

以下内容,完全copy,如有不刚,坚定不移看了!请让我称心快意的搬运工!
抄袭自《View Debugging in Xcode
6》

苹果在Xcode
6中进行了过多显眼的改进同优化,视图调试就是内部之一。平时,App用户界面的行未相会副开发者期望的这样,比如要无出示视图,或者没有对地亮。本文讲解怎样行使Xcode的初的视图调试效能来简化开发者对题目界面的认同和修补。

1.Demo 工程

起首的初先打github(https://github.com/tutsplus/ViewDebugging)上下载示例工程并打开
ViewDebugging.xcodeproj。该工程分包一个简易的含有少数视图控制器的可点击的应用程序、应用程序委托以及一个
storyboard。该app是为小米而计划,但得益于iOS
8的从适应布局,所以界面显得在任何设施上且没问题。

而刚刚下载的应用程序示例工程是一个简约的to-do
list应用程序,包含可查其他音讯的简短屏幕,比如该示例工程中之色屡次,用户头像和@***的推特操作。点击Xcode左上比的运转按钮将显示在iOS模拟器中运作的应用程序。
图24

ACCESS 22
疾会注意到用户界面中在问题-表视图中从不出示外数。在工程导航面板中开辟FirstViewController.swift并找到以下代码:

var mockNotesDataSource: [String] = ["Do some laundry", "Finish homework", "Walk the dog", "Learn about view debugging"]
{
didSet
{
self.tableView.reloadData()
}
}

 

足见见mockNotesDataSource变量是表视图的数据源。使用Swift(Swift)的特性观望者功效,在数据源暴发变更时,表视图会自动还加载。通过查以上代码有,你会意识应用中应有发生4单门类需要呈现,但近日勿显得数据就注明一些地方出现了病。

启用视图调试

题材似乎与用户界面有关。运行app过程中,按下根的Debug View Hierarchy
按钮,或者打菜单中采用Debug > View Debugging > Capture View
Hierarchy 来启动视图调试。

图25

ACCESS 23
起头视图调试后,Xcode会对应用程序的视图层次拍一个快照并出示三维原型视图来探究用户界面的层级。该三维视图除了体现app的视图层次外,还出示每个视图的职、顺序和视图尺寸,以及视图间的交互模式。

示范工程于Xcode中的老三维视图显示正常,但表视图单元格似乎来接触最为松了。
图26

ACCESS 24
停顿应用程序调试并当右边选中Main.Storyboard来修复问题。点击表视图并选中Editor
> Resolve Auto Layout Issues > Reset to Suggested Constraints.
图27

ACCESS 25
编译并还运行应用程序以确定用户界面显得正常。点击Debug View
Hierarchy按钮更进一步询问视图调试的效用。

视图调试成效

点击并拖延拽三维渲染图的即兴一边,可转或者倾斜用户界面,向左或往左边倾斜而选中某个表视图。

当选后,Xcode会高亮该视图,并当会当右手展示Object
和Size检查器。查看在跳转栏顶部并肯定UITableView是右最终一个种。
图28

ACCESS 26

Object 和
Size检查器包括大气实用之音。过去开发者需要靠日志语句或者断点来检查视图的安排。

开辟右侧的Size inspector(规格检查器),下方是Auto
Layout,可以看到视图上既接纳了天经地义的约束。在Object
inspector中,我们好检查所选视图的习性。
图29

ACCESS 27

于Xcode的调试区有9只视图调试过程中而为此到之按钮和滑块儿。
图30

ACCESS 28
从左到右控件排序:

调视图间距:调整不同视图间的间距。

著被细分的内容:当前形视图中于剪切的有的。

彰显约束:显示选中视图的束缚。

重置查看区域:将3D渲染透视图苏醒到默认状态。

调动查看模式:采取性地彰显3D渲染透视图,比如就展现内容,仅呈现框架和以出示内容以及框架。

缩短:裁减3D渲染透视图

复:将3D渲染透视图苏醒到默认尺寸。

放手:放大3D渲染透视图

调而视视图范围:隐藏视图或出示视图,一步步解析3D渲染视图,向左或向右边滑动滑块儿有反的效用。

指出花一点工夫上手操作下这个空中,并了解各自的用途。

盼图层排序

重复编译和运行应用程序,并点击用户界面底部的”More”标签。第一应声去界面看起还OK,然而它没有按开发者的定义准执行,图片及之模糊效果没显示下。我们得经调试视图层次来还好地规定问题所在。

往左或往右边拖拽视图来查看具体情形,接着用view spacing
slider向右边拖动。
图31

ACCESS 29
这样一来,不同视图间的区间变死了,层次为更是清晰,大家看在图片”下方”还暗藏着别样一个视图,选中隐藏的视图,它便是”丢失”的视觉效果视图。
图32

ACCESS 30
打开Main.storyboard 并当选Second View Controller
Scene。在左手的文档概览面板中,展开Second View
Controller的视图对象为查看子视图的排序。

Xcode在文档概览中以提高顺序堆叠视图,换句话说,列表顶层的视图是视图层次的根基。

修补问题大简单。运行时,Blur Effect View隐藏在Sky
Image之下,因为它是视图层次之第一只视图。在文档概览中点击并拖延拽 Blur
Effect View,结果碰头要下图呈现同:
图33

ACCESS 31
双重运行应用程序就可知见到模糊效果了。应用程序的用户界面看起可规划的初衷。大家尚得查看iOS模拟器的另调试功用,看看还周全了任何哪个地方要效益。

5.iOS模拟器调试功能

编译并运行应用程序,选中模拟器,从 Debug菜单中选用Color Blended
Layers选项。
图34

ACCESS 32
接下来会相app的用户界面给红及肉色覆盖,突显了哪些图层可以吃增大覆盖,以及如何图层是晶莹底。混合层属于总结密集型视图,所以推举尽可能地动无透明底图层。
图35

ACCESS 33
苹果于该文档(iOS Simulator User
Guide)中对这一个开展了注脚,并在表视图处理及使了非透明图层。滚动视图时会师聊表现不大好的地点,一个要之因就是以了混合图层,而要情节背景是未透明层,那么页面滚动效应就是会很流畅和平稳。

于那款应用程序来说,假而用户暴发数百单序列如来得,可能会晤现出滚动性能不雷同的图景。表视图单元格当前运的凡混合层。由于视图控制器的视图背景是反革命,所以无论表视图单元格使用的凡混合层或者无透明层,终端用户不会晤意识到起什么不平等。

打开Main.storyboard并当选To Do list
Scene中的表视图单元格属性。在性质检查器(Attributes
Inspector)中,向下滚动Drawing分区并勾选Opaque。
图36

ACCESS 34
当启用Color Blended
Layers的状态下编译并运行应用程序。由于表视图单元格现在使了不透明层,所以相会用藏粉色覆盖,以提醒它们是免透明的。

除外标记图层外,还时有暴发任何有可行之效率可协助开发者在iOS模拟器中调剂应用。以下是内有些于实惠之:

Toggle Slow Animations in Frontmost App:
选中模拟器,打开Debug菜单选中Toggle Slow Animations in Frontmost
App,该意义可降低app中卡通的运转速度,适合调试包含复杂动画的应用程序。也不过以迅速键Command-T来操作。
Color Copied Images:该选项可以叫绘制时叫Core
Animation复制的图形上加蓝粉色叠加层。
Color Misaligned
Images:假诺图片边界没有与对象像从完美对伙同,该意义而也图叠加上同样重合品绿色。假诺图片应用规定的比例大小绘制,那么该效用会吧图上加同叠棕色叠加。
Color Off Screen Rendered:.该选拔也离屏渲染内容增补加一个香艳的折叠加层。
多多开发者会忽视接入电话时以状态栏的宏图问题,你可以通过接触通话被状态栏来概括测试。在iOS模拟器中,从Hardware菜单中当选Toggle
In-Call Status Bar。

记挂查看app怎样响应事件,可依下Command-T来启用slow
animations,并按下Command-Y来体现电话连接时的状态栏。即使你的应用程序使用了导航栏,那么操作系统会为汝兼顾到即同。
图37

ACCESS 35
除了吃视图着质量异,还要记住iOS模拟器也足以调剂Core
Location问题。你可以以一定经纬度模拟设备,

倘使你的应用程序使用iCloud来管理数据,你呢得以手动触发同步事件。

本文中利用的demo
app异常简单,使用文中提到的技艺可以扶持你在将来节省成千上万时刻。视图调试好助您修正很多用户界面被起的题材。

除开Xcode和InterfaceBuilder之外,使用iOS模拟器的调节效能可以提高利用性能及甄别出进程被之瓶颈。苹果之人机交互指南
(粤语版
英文版)强调了积极响应对app的要,能给用户觉得使用易于使和操作。苹果对InterfaceBuilder的提高为视图调试变得前所未有的简
单。

结语

当即单是广大的简要bug修复方法,当然还有Crash的日记、测试工程、以及强牛逼哄哄的老三在调试库等及时篇博客没有干到,有待先前时期补充。

再有我们跟薄优鸡的故事才刚刚起头。

相关文章