在程序中,无论是你想弄清楚为什么数组中有3个对象而不是5个,或者为什么一个新的玩家开始之后,游戏在倒退——调试在这些处理过程中是比较重要的一部分。通过本文的学习,我们将知道在程序中,可以使用的大多数重要调试功能,并如何利用这些调试功能来帮助你以更少的时间解决bug。

本文将介绍如下内容:

  • 使用控制台检查程序的状态
  • 进行日志记录,并熟练的驾驭NSLog
  • 利用对象的生命周期跟踪内存的使用

使用控制台进行检查

在进行调试程序的时候,可能Xcode底部的小黑框会是你最好的朋友。它能输出日志信息,错误信息以及其它各种有用的内容——这可以帮助你进行错误的跟踪。除了可以在看到日志的输出,我们还可以在某个断点出停留住,并检查程序中的变量信息。

带条件的断点

本文假设你以及知道断点是如何工作的了(即使不知道的话,也不用担心,看完本文之后,你将明白!)。

在某个特定的时间点命中断点是非常重要的,在有些断点中,有些时候需要通过一个痛苦的循环或者递归函数才能让我们的对象等于某个确定的值。此时我们可以使用条件断点!

条件断点是这样的一类断点:只有当满足某个确定的条件时,才会命中断点。可以想象一下:我们只希望当对象在某个确定的状态,或者循环迭代到第nth次时才命中断点。单击Xcode editor中的‘gutter’可以添加一个断点,在断点上单击右键,然后选择‘edit breakpoint’,就可以设置特定的条件了。

可以提供一个条件(例如i==12),或者断点忽略次数。另外还可以添加动作,该动作可根据断点自动发生,例如一个debugger command——打印一个值。

提示:添加/删除断点的键盘快捷键是command+\

另外一个重要的断点技巧是添加一个异常断点(exception breakpoint)。当遇到异常时,基本99%次Xcode都会自动转到main方法中的autorelease pool中。

感谢Xcode…真的太有用了!

通过异常断点,可以方便的定位到引起异常发生的具体代码行。异常断点的添加方法:打开异常断点tab(command+6)。选择窗口左下角的”+”按钮,并添加一个‘exception breakpoint’,这样,当Xcode遇到异常时,将会在引起异常代码的地方发生断点停留。

在控制台进行手动打印

一般情况下,我们在程序代码中添加断点,是为了通过Xcode提供的‘variables view’(该view在Xcode底部console旁边)来查看变量的状态 。理论上,该窗口可以显示出与当前上下文相关的所有值的状态。实际上,这有点小问题,有时候断点过了之后,该窗口并不会进行相关的更新。

很不错的一个功能是:我们可以使用控制台的命令来检查某个特定的对象——这非常有用。在控制台输入‘po’就可以打印出指定对象的即时信息(处理scalar值时使用‘p’)。

在查看一个已经存在的对象时,这非常有用(如果对象不存在的话会打印出nil)——确定对象的值,查看数组/字典在运行时的信息,甚至是两个对象的比较(这个命令可以打印出相关对象的内存地址,我们可以打印出两个对象的信息,然后看看它们的内存地址是否相同)。

另外非常有用(但是被隐藏的命令)可以非常容易的对view进行检查——therecursiveDescription命令——在view上调用这个命令可以打印出view的继承关系。

 有效的进行Log

有时候在进行程序调试的某个确定时间里,我们希望将消息打印到控制台,此时可以使用NSLog函数,通过该函数可以将任意的输出打印到控制台。在不使用断点时,这个功能非常有用。NSLog遵从的格式与[NSString StringWithFormat]方法遵从的格式一样。

提示:这里可以看到Objective-C中关于字符串格式化的信息: String Programming Guide

让NSLog更加智能

虽然NSLog非常有用,但是在真机上,从NSLog打印出来的任何内容都会被保留,隐藏所有人都可以看到——只需要将设备连接到电脑,然后打开XCode中的organiser,并定位到console,就可以看到每条log信息。可能你会意识到,这会带来一些严重的影响!想一下,如果你将一些保密的算法逻辑,或者用户密码打印到控制台!因此,如果苹果检测到在production build中,输出许多内容到控制台时,你的应用可能会被苹果拒绝上架到商店。

幸运的是,这里有一个最简单的办法进行log——通过一个宏,让NSLog只在debug build的时候起作用。将这个功能添加到全局都能访问得到的头文件中。这样你就可以尽情的使用log了,并且当进行production时,不会包含log相关代码。如下代码:

#ifdef DEBUG
#defineDMLog(...)NSLog(@"%s %@", __PRETTY_FUNCTION__,[NSString stringWithFormat:__VA_ARGS__])
#else
#defineDMLog(...)do{}while()

补充:如果上面的写法有点复杂 下面的写法就简单的多

//release屏蔽NSLog
//放在.pch文件里
#ifdef DEBUG
#else
#define NSLog(...) {};
#endif

现在如果使用DMLog,那么将只会在debug build期间打印出log。而production build时则不会有任何log。通过__PRETTY_FUNCTION__ 可以打印出打印log所在的函数。

下一步

虽然NSLog非常出色,但它也有一些限制:

  • 只能在本地打印
  • 不支持带级别的log(例如严重、警告等)
  • NSLog效率低。在进行大量处理时,NSLog会严重影响程序的执行效率

互联网上也有一些框架可以进行日志记录,通过这些框架可以避免NSLog的一些限制。下面有两个不错的:

  • Cocoa LumberJack – 这是针对Cocoa非常出名的一个日志框架。虽然刚开始用的时候会费劲点,但是它非常强大。
  • SNLog – NSLog的一个替代品。

跟踪对象的生命周期

虽然ARC可以对内存进行有效的管理,不过在对象的生命周期内跟踪一些重要的事件仍然是重要的。毕竟ARC并不能完全消除内存泄露的可能性,或者确保访问的是一个被release掉的对象(ARC只是尽量避免这样的情况发生)。为此,我们可以使用一些方法和工具来观察并留意对象在做些什么。

 Log一些重要的事件

在一个Objective-C对象的生命周期中有两个重要的方法:init和dealloc。将这两个方法调用的事件log到控制台是不错的选择——你可以通过控制台观察到对象生命的开始,更重要的是,可以确保对象的释放。

  1. -(id)init
  2. {
  3. self=[super init];
  4. if(self)
  5. {
  6. NSLog(@"%@: %@",NSStringFromSelector(_cmd),self);
  7. }
  8. returnself;
  9. }
  10. -(void)dealloc
  11. {
  12. NSLog(@"%@: %@",NSStringFromSelector(_cmd),self);
  13. }

静态分析器(Analyzer) 和检查器

在Xcode中有两个工具可以用来清理代码,以减少代码的错误率。静态分析器工具可以对我们的代码提出改进意见,比如检测出没有使用过的对象,没有release对象(针对Core Foundation对象,ARC仍然会有这样的问题)。通过选择Product菜单中的‘Anlayze’可以查看到相关建议。

检查器是非常强大的一组工具,通过检查器不仅可以从不同的角度检查我们程序对内存的使用情况,文件系统的使用情况(增加、删除、修改等),甚至还提供了自动UI交互的方法。通过选择Product菜单中的‘Profile’可以查看到这些检查器。

选择‘Profile’会打开一个Instrument窗口,这里可以选择一个配置模板进行运行。最常用的模板有zombies(稍后会讨论),activity monitor和leaks。在程序运行时,对内存泄露进行捕捉时,Leaks可能是最有用的一个模板。

Zombies是你的朋友

虽然在有ARC的地方很难再遇到让人难受的EXC_BAD_ACCESS错误了,但是在某些确定的情况下,该错误还是会发生的。当在处理UIPopoverController或者core foundation对象时,我们可以访问一个已经被release掉的对象。一般,当我们release内存中的一个对象时,该对象将被销毁。但是,当Zombies开启时,只是将对象标记为release,实际上该对象还停留在内存中。当我们访问一个Zombie对象时,Xcode可以告诉我们正在访问的对象是一个不应该存在的对象了。因为Xcode知道这个对象是什么,所以可以让我们知道这个对象在哪里,以及这是什么时候发生的。

这里有两种方法可以查找出Zombies对象。使用检查器中的Zombie配置模板,或者在‘Run’ build选项中开启Zombie诊断选项。在Stop按钮的旁边,点击scheme名称,然后选择‘Edit Scheme’,点击diagnostic tab项,并勾选上‘Enable Zombie Objects’。注意,Zombie只能用在模拟器调试中,真机上不能使用。

结论

(ios实战)ios调试总结(转载)的更多相关文章

  1. Chisel辅助iOS 应用程序调试,MusicApp模仿酷狗4.0 UI框架

    本文转载至 http://www.cocoachina.com/ios/20140825/9446.html Chisel Chisel集合了大量的LLDB 命令来辅助iOS 应用程序调试,并支持添 ...

  2. React-Native iOS真机调试(新版)

    2019独角兽企业重金招聘Python工程师标准>>> React-Native iOS真机调试 看到网上很多以前的文章 找到两种方法 一 修改AppDelegate 把URL的替换 ...

  3. iOS 真机调试不能连接网络的排错过程

    开发环境: macOS 10.12.1 Xcode 8.1 Qt 5.8 gSOAP 2.8 iPhone 6S+iOS 10.1.1   问题: 使用 Qt Quick 写了一个跨平台的应用,在Wi ...

  4. iOS真机调试之我见

     入职20多天,以前一直以为iOS真机调试是多么复杂的事情,但在公司大牛的帮助下:终于理清头绪,由于公司证书已申请,文章中免不了旁征博引. 1.首先,得有苹果开发者账号,如果在公司,公司会提供:不在公 ...

  5. 关东升的iOS实战系列图书 《iOS实战:入门与提高卷(Swift版)》已经上市

             承蒙广大读者的厚爱我的 <iOS实战:入门与提高卷(Swift版)>京东上市了,欢迎广大读者提出宝贵意见.http://item.jd.com/11766718.html ...

  6. 关东升的《iOS实战:图形图像、动画和多媒体卷(Swift版)》上市了

    关东升的<iOS实战:图形图像.动画和多媒体卷(Swift版)>上市了 承蒙广大读者的厚爱我的<iOS实战:图形图像.动画和多媒体卷(Swift版)>京东上市了,欢迎广大读者提 ...

  7. react native iOS真机调试-联网问题与js严格模式

    rn:strict mode does not allow function declarations in a lexically nested statement https://blog.csd ...

  8. ios真机调试教程(不上架App Store安装到手机)

    原文 不上架App Store安装到手机调试测试,需要用到ios真机调试证书打包的ipa才能安装到非越狱的手机使用. 2017年最新整理的ios真机调试的详细图文步骤流程,轻松的把你开发的ios ap ...

  9. IOS 真机调试和发布相关证书

    一.成员介绍1.    Certification(证书)证书是对电脑开发资格的认证,每个开发者帐号有一套,分为两种:1)    Developer Certification(开发证书)安装在电脑上 ...

随机推荐

  1. 读Java Concurrency in Practice. 第六章.

    这一章开讲任务执行.绝大多数并发程序的工作都可以分解为抽象的.互不相关的工作单元,称之为任务(Task). 使用java线程来执行任务 以web服务器的实现举例, 此时将用户的一次连接,当做一个独立的 ...

  2. JS&CSS文件请求合并及压缩处理研究(二)

    上篇交待了一些理论方面的东西,并给出了另外一种解决方案的处理流程.本篇将根据该处理流程,开始代码方面的编写工作. 1,打开VS,新建ASP.NET MVC Web项目,项目类型选择空.名称为 Mcmu ...

  3. python网络编程socket /socketserver

    提起网络编程,不同于web编程,它主要是C/S架构,也就是服务器.客户端结构的.对于初学者而言,最需要理解的不是网络的概念,而是python对于网络编程都提供了些什么模块和功能.不同于计算机发展的初级 ...

  4. 转载:全球首个微信小程序(应用号)开发教程!通宵吐血赶稿,每日更新!

    微信应用号(小程序,「应用号」的新称呼)终于来了! 目前还处于内测阶段,微信只邀请了部分企业参与封测.想必大家都关心应用号的最终形态到底是什么样子?怎样将一个「服务号」改造成为「小程序」? 我们暂时以 ...

  5. const与readonly深度分析(.NET)

    前言 很多.NET的初学者对const和readonly的使用很模糊,本文就const和readonly做一下深度分析,包括: 1. const数据类型的优势 2. const数据类型的劣势 3. r ...

  6. Genymotion模拟器环境搭建中的各种坑,终极解决办法

    最近刚进入了一家公司,因为要做自动化测试,web端的业务需要移动端来进行配合,想了想还是利用genymotion模拟器吧:很久前装过,那也是一路坎坷啊,结果这次还是遇到坑了,搞了老半天:我希望我踩过的 ...

  7. Web 前端性能优化准则

    准则01:尽量减少http请求 “只有10%-20%的最终用户响应时间花在接收请求的HTML文档上,剩下的80%-90%时间花在HTML文档所引用的所有组件(图片,script,css,flash等等 ...

  8. thread_Disruptor

    转自 知乎 https://zhuanlan.zhihu.com/p/21355046 order从client端传入,decode后进行matching,一旦存在可成交的价格,就要publish到t ...

  9. 带复杂表头合并单元格的HtmlTable转换成DataTable并导出Excel

    步骤: 一.前台JS取HtmlTable数据,根据设定的分隔符把数据拼接起来 <!--导出Excel--> <script type="text/javascript&qu ...

  10. Python入门笔记(26):Python执行环境

    一.python特定的执行环境 在当前脚本继续进行 创建和管理子进程 执行外部命令或程序 执行需要输入的命令 通过网络来调用命令 执行命令来创建需要处理的输出 动态生成Python语句 导入Pytho ...