BUG,简单来说就是程序运行结果与预期的不同,下面来说说Xcode中的DEBUG方法
断点调试
- 普通断点
- 全局断点
- 条件断点
1.普通断点
看图

当程序运行到断点处时会停下,然后进行单步调试

2.全局断点
当程序运行出现崩溃时,就会自动断点到出现crash的代码行

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

添加条件Condition


还可以Action中在条件断点触发时执行事件

如:输出信息

4.方法断点
打印调试
尽管ARC已经让内存管理变得简单、省时和高效,但是在object的life-cycles中跟踪一些重要事件依然十分重要。毕竟ARC并没有完全排除内存泄露的可能性,或者试图访问一个被release的对象。
- NSLog
强化NSLog
//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)
控制台输出
<ViewController.m : 32> -[ViewController viewDidLoad]
2016-10-14 17:33:31.022 DEUBG[12852:1238167] Hello World!
-------
利用NSString输出多种类型

- 开启僵尸对象
Xcode可以把那些已经release掉得对象,变成“僵尸”,当我们访问一个Zombie对象时,Xcode可以告诉我们正在访问的对象是一个不应该存在的对象了。因为Xcode知道这个对象是什么,所以可以让我们知道这个对象在哪里,以及这是什么时候发生的。
所以Zombies是你的好基友!他可以让你输出的信息更具体!
具体这样做:(僵尸只能用在模拟器和OC语言)

控制台(lldb 命令)
LLDB 是一个有着 REPL 的特性和 C++ ,Python 插件的开源调试器。LLDB 绑定在 Xcode 内部,存在于主窗口底部的控制台中。调试器允许你在程序运行的特定时暂停它,你可以查看变量的值,执行自定的指令,并且按照你所认为合适的步骤来操作程序的进展。(这里有一个关于调试器如何工作的总体的解释。)
你以前有可能已经使用过调试器,即使只是在 Xcode 的界面上加一些断点。但是通过一些小的技巧,你就可以做一些非常酷的事情。GDB to LLDB 参考是一个非常好的调试器可用命令的总览。你也可以安装 Chisel,它是一个开源的 LLDB 插件合辑,这会使调试变得更加有趣。
参考:
基础
help
在控制台输入help
,显示控制台支持的lldb命令
打印值
缩写p
print是 expression --
的缩写

printk可以指定格式打印
如
默认 p
十六进制 p/x
、
二进制 p/t
(lldb) p 16
16
(lldb) p/x 16
0x10
(lldb) p/t 16
0b00000000000000000000000000010000
(lldb) p/t (char)16
0b00010000
你也可以使用 p/c 打印字符,或者 p/s 打印以空终止的字符串 p/d打印ACRSII(译者注:以 '\0' 结尾的字符串)。
完整清单点击查看
po
打印对象,是 e -o --
的缩写
expression
流程控制
当你通过 Xcode 的源码编辑器的侧边槽 (或者通过下面的方法) 插入一个断点,程序到达断点时会就会停止运行。
调试条上会出现四个你可以用来控制程序的执行流程的按钮。

工具调试(instruments)
instruments Xcode自带许多工具供大家使用,打开方式如下图:

leaks内存泄漏检查工具

运行后查看

视图调试
启用视图调试:运行app过程中,按下底部的Debug View Hierarchy 按钮,或者从菜单中选择Debug > View Debugging > Capture View Hierarchy 来启动视图调试。

启动视图调试后,Xcode会对应用程序的视图层次拍一个快照并展示三维原型视图来探究用户界面的层级。该三维视图除了展示app的视图层次外,还展示每个视图的位置、顺序和视图尺寸,以及视图间的交互方式。
模拟器调试
编译并运行应用程序,选中模拟器,从 Debug菜单中选择Color Blended Layers选项。

然后会看到app的用户界面被红色和绿色覆盖,显示了哪些图层可以被叠加覆盖,以及哪些图层是透明的。混合层属于计算密集型视图,所以推荐尽可能地使用不透明的图层。

未完待续。。。
网友评论