您的位置:首页 > 移动开发 > IOS开发

ios 调试技巧

2016-03-23 14:25 405 查看
一、BreakPoint(普通断点)

当程序运行到断点处,便暂停运行。



调试过程可通过下方看到对应参数的值



二、Condition BreakPoint (条件断点)

对断点的属性进行设置,使断点智能化。右键进入断点属性设置。



1、Condition 参数 : 特定值暂停程序运行。下图表示,当运行到i=2的时候,暂停运行。



此时,在控制台输出i=0和i=1的值,当i=2的时候,断点生效程序暂时停止运行。我们在此时再将i的值po出来,验证下,结果是一致的。



2、lgnore参数(int类型): 忽略程序最前面的n次运行,而在n+1次中断程序,暂停运行。



图中表示,在输出第3个数时,停止运行,此时,应该输出0、1、2这个三个数。此时,po出i的值,应该是i=3。验证下。



3、Action 参数: 查看某个函数被调用的次数和某个函数具体在哪个函数里面执行。设置Action参数如下,注意要选中Automatically continue after evaluating actions。

3.1 输出函数NSLog被调用次数



查看控制台



3.2、 输出函数NSLog具体在哪个函数里面执行(被调用)



查看控制台,输出函数NSLog在viewDidload中被调用



三、异常断点(Exception BreakPoint)

开发iOS知道,如果我们因为异常然后程序crash了,代码就直接跑到main.m的main函数中去了。为什么就不能跑到出现异常的代码中呢?异常断点就为我们解决该问题,程序就会在异常出现的那行代码终止。

举个简单的例子,下面的这几行代码,明显的越界。



程序运行后,在没有添加全局异常断点的时候,程序直接crash在main函数中。



然而,在你添加异常断点后,会定位到具体的代码。



添加异常断点后,再运行程序





四、符号断点(Symbol BreakPoint)

符号断点可以指定哪个类里具体的某方法执行时中断。如果没具体某个类,只写方法名,那么当整个工程运行到某方法名时,程序就中断。

符号断点的创建跟异常断点差不多。



右键编辑符号断点:在ViewController 类里面指定到_loadRequest 这个方法时打断。



效果如下



当你的符号断点编辑只剩下方法名,那么工程里面指定到Symbol的函数名时,程序都会打断。



五、僵尸对象

僵尸对象 :iOS中把那些已经release但还没完全消失的对象。

对已经release的对象再次释放,就会发生异常。

自从使用ARC后,由于对象释放产生的异常已经大大变少,但偶尔还会出现。开启僵尸对象模式后,就能快速定位到异常位置。开启方式如下:Product–>Scheme–>Edit Scheme.

勾选Enable Zombie Objects即可。



六、lldb命令

Xcode中使用llvm编译器,lldb是llvm中的调试器,我们可以使用一些简单的命令进行调试,上面再讲到断点的时候有提到po命令。这是最常用的命令行之一,另外一个就是print。



七、暴力调试

应该说NSLog打印信息是初学者最喜欢的调试手法,也是最简单的调试。
通过打印出的信息查看程序运行的路径。但是打印出的信息较少,本身NSLog效率较低,而且损耗性能。一般在打包发布app的时候,尽量的去屏蔽这个输出函数。
应该有很大一部分人会将NSLog定义成宏,在debug下,打印,release下不打印。
然后,除了这个,输出函数要定义成宏海可以继续优化。输出具体:所在类名、所在方法名、详细时间、行号。


#define NSLog(format, ...) do {

fprintf(stderr, "<%s : %d> %sn",

[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String],

__LINE__, __func__);

(NSLog)((format), ##__VA_ARGS__);

fprintf(stderr, "-------n");

} while (0)


八、运行时间

有时候我们想要准确的知道某段代码、某个循环执行的时间,然后分析效率等问题,这个时候就需要执行时间是多少。

定义两个宏

#define TICK   NSDate *startTime = [NSDate date]
#define TOCK   NSLog(@"Time: %f", -[startTime timeIntervalSinceNow])




九、手机截屏

可能你看到这个标题会觉得很奇怪,为什么手机截屏也放在调试技巧里面?开日常开发中,我们经常会在真机调试阶段用手机电源键+Home键截屏,然后利用手机上面的通讯软件发送给其他人,这个比较麻烦。x-code 也为我们提供了屏幕截屏的方式。

真机调试过程中,选择debug->View Debugging ->Take ScreenShot of IPhone。 mac桌面就会生成手机运行在该界面的手机屏幕截图。注意: 每需要截图都需要设置一次。

十、UI调试

一般的老程序员喜欢用纯代码去实现UI,对于新手来说,特别是复杂的UI,接手这样的项目就比较头疼。x-code提供了视图之间的层级关系,方便我们进行调试。当我们程序运行到某一个界面时,可点击下面的按钮



这样就会进入视图调试模式,就可以轻易查看视图之间的层级关系



左侧的树形层次图可以在查看线程、队列和UI之间切换



十一、内存分析器

快捷键: commadn+ shift +B

这个一般用来监测内存泄露问题。它是一种静态的工具,可以对我们的程序进行分析,找出我们未使用的变量,或一些死存储。

十二、Profile



这个控制面板的组件,几乎每一个组件都能单独开一篇博客。之后再讲吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: