文档章节

iOS各种调试技巧豪华套餐(上)

BruceYu的博客
 BruceYu的博客
发布于 2015/05/16 14:01
字数 3749
阅读 66
收藏 1

 

前言

最近博主临近毕业季,为了完美的写一篇毕业论文,真是:“锄禾日当午,汗滴禾下土”<—— 这句诗跟毕业我写毕业论文没任何一毛钱关系,我就是突然想吟湿了。不过博主作为网络工程专业的好青年,曾经的愿望和理想就是在下水道干出一番轰轰烈烈的大事业,没错是就是下水道,我们的征途在下水道!!不过大家别误会,我不是忍者龟的脑残粉!听我继续说!我想的是等我在各大排水系统各大下水道功成名就的时候,我就可以指着一个井盖对我的孙子说:“诺 那个下面的通信光缆是爷爷我接的!!” 我满脸自豪地接受着这孙子的敬仰!但是啊,曾经的愿望都实现不了了,我深深爱着的地下通信光缆啊,曾经多少个夜晚泪水打湿了我的毕业论文,渲染开的笔墨那都是哥逝去的青春啊。

因为生活就像开了博主一个玩笑,让博主遇到了一种鸡,那是一种特殊品种的鸡,它叫做逼优鸡!!就是这只鸡让博主无缘无故的成了一只APM超200的野生究极程序猿!!吼~ 嗷~,把博主带离了下水道!并且与这只鸡踏上另一端征途!临走的时候,下水道的通信光缆就交给你们了,肥皂基友们(网络工程的基友们)!!我靠,他们竟然在打印店花了50块钱就直接买了一套深度豪华毕业论文套餐!里面包含了论文,工程制图,CAD,报价清单,拓扑结构……最重要的是老板承诺不需任何修改,直接可以通过毕业答辩,不通过来年免费再提供一套论文,最贴心的是竟然支持通过再付款!!,

图1

老子写论文写了半个月像狗一样,他们竟然直接就买了!就这么买过去了!!对得起老师的谆谆教诲、自己的辛苦付出和父母的期待么?我就问你们惭愧不惭愧?为什么买的时候不喊上我?泪已淌干~

逼优鸡

终于来到了大家期待的正片,今天我就要和大家讲我和逼优鸡的故事,逼优鸡它优雅低调,它身材玲珑,藏匿在黑暗处,挑动着我的欲望!曾多个日夜博主都……(擦!尼玛,逼优鸡是什么鬼?说好的技术文章?)同学你真的(biè)急,你先坐下,先把鞋子穿好!我说的逼优鸡它的英文名叫做(Bug),它挺(T)美(M)的(D)……

歌仔唱的好:

多少猿曾被它夺走年轻的容颜

多少猿曾在它面前亮门秃了头

多少Bug曾经生命中来了又还

可知一生有你我都陪在你身边

图2

无数个夜晚你揪着头发和Bug撕咬的情景博主可以体会,所以这次的这篇文章博主就要给大家整理一个调教IOS逼优鸡的方法豪华套餐!!放心!绝对的深度豪华,因为已经加入肯德基豪华午餐~咳咳~其实是因为逼优鸡(Bug)对于我们毕竟是除了老婆之外第二可怕的存在!我们必须要练就铜头铁臂十八般武艺,祭练奇门巧技各种大杀!方可与之周旋并将之歼灭!好!跟着博主一起装逼一起飞吧!!!!

第一步:

我看大家蓬头垢面的就知道大家刚刚也才debug回来 ,我们就先写个hello world压压惊把!

第二步

……

知己知彼 百战不殆

此处为大量Copy!不喜请喷!

The software doesn't do something that the product specification says it should do.

The software does something that the product specification says it shouldn't do.

The software does something that the product specification doesn't mention.

The software doesn't do something that the product specification doesn't mention but should.

The software is difficult to understand, hard to use, slow, or in the software tester's eyes will be viewed by the end user as just plain not right.

我不是英文教师,请大家自行切换多语言阅读模式。

也还有有人粗暴的定义 ”Bug就是错误“,除了世界上第一只Bug是飞进去的那只虫子外,其他Bug毋庸置疑那都是程序员们自己生下来的!程序员们自己犯的错误!如果说一个软件作品(请尊重你自己的作品,不要喊他们”产品”或者”项目”)是程序员们自己的孩子,那么Bug就是这个孩子的生的病,有病得治,药不能停!生病有各种治疗方法,物疗,理疗,化疗,心理疗……那么“治疗”Bug也是有多中方法的!下面博主会一一列举!惩治这些个Bug之前,博主要先阿拉巴拉一番,遇到Bug也是一件比较哔了狗了的事情,你要知道任何人都会生病,没有例外!所有任何代码都有Bug这是定理,我们首先要从心态上端正Bug这件事情,我们可以理解为缺憾也是一种美,就像阿雨说的“没有皱纹的祖母是可怕的,没有白发的老者是让人遗憾的。没有废墟的人生太累了,没有废墟的大地太挤了,掩盖废墟的举动太伪诈了。”Debug是为了证明程序有错,而不是证明程序无错误;所以我们要做到临Bug而不惧者,圣人之勇也!所以我们要做到战略上藐视它,战术上重视它!你要心理默念Bug其实挺(T)美(M)的(D)!anyway 无Bug不生活!!

抽刀断Bug

断点,(我求你们不要想到张敬轩,阿轩他容易么,小受又怎么了?你们这帮人真是的!!),我要说的断点是BreakPoint!基本上不是残废的IDE都具有断点调试功能吧!尤其是XCode,我们家的IDE断点调试功能可是强中又是强中手!在这之前大家可以先了解一下哈子是断点?它怎么实现的?工作原理怎么样的?博主就献丑说说自己的理解吧,断点,顾名思义就是从前有一个点,后来它断了,谢谢,我的故事讲完了。哎哟还不服,这些基础常识的东西自己不会查?你还真的脸皮厚上天了去了,还要博主给你查哟,自己查去!

普通操作

如图3

基本的断点操作如下

图4

点击那个黑列列就创建了一个断点,再次点击就临时取消这个断点(但是不删除),长按那个断点拖出去就删除了(mac os的系统工程师就是稀饭拖动的快感),当然也可以右键那个创建的断点,会弹出相应地菜单。

当然也还可以监视某个变量!

图5

在对象视图中,右键某个对象,点击“Watch ‘XXX’”就完成XXX对象的监视了。

这里我监视了lab这个UILabel的变量,每当这个变量进行更新它的信息就会被打印到控制台。

好吧!我们最基本的创建断点的工作已经学会了,Xcode舒服在什么地方呢?就是不分Debug模式和Run模式的,可以说是无缝切换的,你只要没有创建断点,那么就是Run的正常模式,如果创建了断点并且运行到断点处,就自动进入Debug模式咯,不像某EC开头的IDE,控制面板就像开飞机的一样,几万个按钮以为很强大,其实只用了Run和Stop,还有什么Debug模式,App模式……,果然Xcode的优越感在对比中更加强烈了,舒服到极点呀,就像夏天的海风拂过菊花,嗯是的 就是那种感觉!

我们创建好了断点,运行到断点就自动停下来了,像这样:

图6

这些Debug的最基本操作技能是每一个入门的IOS开发者都要掌握的,应该当成一种本能,就像狗爱吃翔一样(噢 对不起 博主不是歧视狗的意思,博主也养过狗,很二逼但是从不吃翔!真的据我所知它从来不吃翔的,这里只是比喻只是比喻)。

全局断点(Global BreakPoint)

有时候在程序出错的时候不能能准确定位到奔溃的那一行代码,而是直接跑到main循环或者Appdelegate里面, 或者会给你这样的提示:

EXEC_BAD_ACCESS:

是不是有种想哭的冲动?尼玛~至少给我一些堆栈信息也好呀~……这个时候你千万不要砸鼠标和键盘哦,一切都是主机在运行,你砸鼠标和键盘有什么用呢?应该是踢主机呀~~,现在有了全局断点,娘亲再也不担心你砸鼠标了,你只需要这样:

图7

在Debug导航面板进行上图的操作,你就建立了全局断点,这样只要遇到错误,debug程序就会自动定位到栈底的信息,也就是你最先出错的代码的那一行,这样你就可以快乐的debug拉~~

条件断点(Condational Breakpoints)

从前有一个游戏,叫做撸啊撸,有些玩家他们知道怎么操作,会放技能会走路,但是他们不知道买装备,玩了一局下来,鞋子小刀都没有买。我为什么讲这个故事呢?因为很多小朋友学东西和玩游戏一样,看完前面的几种调试技能,就以为自己已经屌爆无敌了,其实他们不过是出门不带装备的玩家,如果只是使用了以上的调试技能只能说是低玩,在高大的逼优鸡面前根本就是会被瞬秒的那种,所以学会装备自己才是王道!条件断点,就是学会有的放矢!

我们来看一段代码

图8

你是不是想问博主为何那么风骚,竟然上了Swift了!!我此刻只想吟一首湿:别人笑我太淫荡,我家住在黄鹤楼。

反正这个年代大家都是吃饱了撑着的,博主也是,所以就学学Swift咯。

我们如果在一个循环里面使用了断点,如果这个循环执行了100万次,那你的断点要执行那么多次,你不觉得蛋蛋都凉了的忧伤么?所以我们这么做:

图9

这样只有遍历到c==“H”的时候 断点才会被触发。

图10

是不是很棒呢!

有些童鞋的钛合金狗眼已经看到了编辑断点那里有一个Action的东西,那是什么呢?

这个是非常强大的,可以在你断点的位置,执行各种操作,比如执行脚本命令,控制台命令(可以制定调试信息自定义保存)、打印信息等,
博主最喜欢的就是这个Log message啦,简单粗暴!根本就不需要print啊NSLog嘛,直接在断点的Action打印就好了(其实这个是Xcode和调试器结合的高能产物,下面再介绍)。具体可以这样:

图11

其实刚刚博主撒谎了,博主最喜欢的Action并不是Log Message,而是Sound,顾名思义嘛,断点射在Bug上,这样遇到断点就会发出声音,听到我自己设置的声音,我就知道是什么Bug了,听声识Bug,呵呵,EXEC_BAD_ACCESS的错误我设置成了波多野老师的声音,unrecognized selector send to instancd的错误我设置成了苍老师的…… 不要问我系统怎么没有吉泽明步的声音,我根本就不知道谁是吉泽明步。

当然还有更加强大的条件断点就是这货啦

图12

添加之后在 Symbol 一栏输入 viewDidLoad。

这样一来,在程序中所有的 viewDidLoad 方法被调用时都会触发断点。

图13

当然,我们也可以仅仅为特定的某个类的方法添加断点。在 Symbol 一栏输入 [ClassName viewDidLoad] (Objective-C) 或 ClassName.viewDidLoad (Swift) 即可。

比如:unrecognized selector sent to instance 0xaxxxx 这种错误,这个instance可以这样快速定位

图14

打印的艺术

尽管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

开启僵尸对象(Enable NSZombie Objects)

Xcode可以把那些已经release掉得对象,变成“僵尸”,当我们访问一个Zombie对象时,Xcode可以告诉我们正在访问的对象是一个不应该存在的对象了。因为Xcode知道这个对象是什么,所以可以让我们知道这个对象在哪里,以及这是什么时候发生的。

所以Zombies是你的好基友!他可以让你输出的信息更具体!!

具体这样做:

图15

自己再试试输出Object的信息咯,是不是很棒呢?

僵尸只能用在模拟器和OC语言哦~


本文转载自:http://www.uml.org.cn/mobiledev/201505123.asp?artid=16351

BruceYu的博客

BruceYu的博客

粉丝 19
博文 59
码字总数 23494
作品 7
东城
高级程序员
私信 提问
iOS各种调试技巧豪华套餐(下)

进击的码农 如果说你已经把打印的艺术运用的风生水起了,并且断点的使用可以信手拈来随心所欲,那么你已经在与逼优鸡的对峙中,稳操大部分胜券了,你已经是一个孤高冷艳的程序员了,俯视一切...

BruceYu的博客
2015/05/16
81
0
iOS项目开发

主要需求: 通过远程网络对汽车进行OBD(启动、熄火、门锁检测、车辆状态设置与检测、胎压等相关汽车状态的设置与获取展示) 工作内容: 1. 熟悉车载CAN、OBD相关行业知识 2.负责智能穿戴产品I...

黄淑宾
2017/02/22
34
0
苹果向开发者发布 iOS 8 Beta 4,第四个测试版

苹果今天向开发者发布了 iOS 8 第四个测试版 Beta 4,距离第三个测试版发布相隔两周。已经安装 iOS 8的用户可以通过 OTA 在线进行更新,此外开发者也可以从网站下载 iOS 8 Beta 4。iOS 8加入...

oschina
2014/07/22
1K
0
WWDC16 一览:iOS、OS X 轮番升级,Siri 飞上枝头当凤凰

一年一度的WWDC大会将在14日凌晨一点正式召开。而在大会之前,以苹果那“专业”的保密工作来看,基本所有的信息都已经提前曝光。赶在发布会前,我们先看看2016年的WWDC大会有什么亮点吧。 再...

oschina
2016/06/13
3.9K
22
OSC 第 76 期高手问答 — iOS 性能优化&数据持久化

OSCHINA 本期高手问答 ( 5月27日- 6月2日) 我们请来了@智捷课堂(关东升)为大家解答关于 iOS 性能优化和数据持久化 方面的问题。 关东升,智捷课堂创始人,国内知名 iOS 技术作家,iOS 技术...

叶秀兰
2015/05/27
4.1K
28

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周二乱弹 —— 开发语言和语言开发的能一样么

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @花间小酌:#今日歌曲推荐# 分享The Score的单曲《Revolution》 《Revolution》- The Score 手机党少年们想听歌,请使劲儿戳(这里) @批判派...

小小编辑
今天
1K
16
oracle ORA-39700: database must be opened with UPGRADE option

ORA-01092: ORACLE instance terminated. Disconnection forced ORA-00704: bootstrap process failure ORA-39700: database must be opened with UPGRADE option 进程 ID: 3650 会话 ID: 29......

Tank_shu
今天
3
0
分布式协调服务zookeeper

ps.本文为《从Paxos到Zookeeper 分布式一致性原理与实践》笔记之一 ZooKeeper ZooKeeper曾是Apache Hadoop的一个子项目,是一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它...

ls_cherish
今天
4
0
聊聊DubboDefaultPropertiesEnvironmentPostProcessor

序 本文主要研究一下DubboDefaultPropertiesEnvironmentPostProcessor DubboDefaultPropertiesEnvironmentPostProcessor dubbo-spring-boot-project-2.7.3/dubbo-spring-boot-compatible/au......

go4it
昨天
3
0
redis 学习2

网站 启动 服务端 启动redis 服务端 在redis 安装目录下 src 里面 ./redis-server & 可以指定 配置文件或者端口 客户端 在 redis 的安装目录里面的 src 里面 ./redis-cli 可以指定 指定 连接...

之渊
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部