1. 什么是LLDB?
LLDB,底层调试器,在xcode的Debug区域,能看到蓝色的小字 (lldb)
2. 什么dsYM文件?
dsYM是调试信息文件,因为后缀名.dsYM,所以叫sdYM文件,创建新工程时,默认就会创建dsYM文件,Build Setting里有相应的设置
3. 什么是符号化?
程序运行时,是将源代码转成机器码运行的,程序一旦崩溃,所能收集到的崩溃信息,无非是一些内存地址,十六进制码,必须转成方法名或变量名,才能看懂崩溃信息,这个转换的过程称为符号化,符号化依据dsYM文件,因为dsYM文件中,存储着内存地址和方法名之间的映射。
4. 符号化的方法
http://www.cocoachina.com/industry/20140514/8418.html
5. 断点
5.1 添加异常断点
5.2 添加符号断点
和添加异常断点同一按钮,选Symbolic Breakpoint,符号断点,通常用来关注你想关注的方法(感觉比较鸡肋)
5.3 编辑断点
开发创建的任何断点,都可以编辑,进入编辑界面,可以在condition中编辑条件。比如一个100次的循环,需要在执行第50次时,打上断点,可以在condition中写上index>50 (不一定是index,由for循环中条件变量决定),这个比较有用
5.4 共享断点
在xcode的左侧导航栏,切换至断点导航栏界面,按住crtl点击某一断点,可以选share,可以将断点上传到版本控制系统中,这个很鸡肋
6. 观察点
程序运行时,可以在debug区域的左部分,选中某个变量,按住ctrl,点击某一变量,再点击watch,一旦这个变量的值发送变化,会自动在控制台中打印old值和new值,并且观察点会自动被添加到断点导航中,这个比较有用,用来监控全局变量或单例的属性值
7. 在LLDB中调试神器
7.1 打印变量
当用断点跟踪问题时,如果忘记NSLog了,可以用p或po打印,p打印非容器变量,po打印容器变量,例如字典、数组、集合的。
7.2 打印视图层级结构
recursiveDescription是没有自动补全的,敲回车就能看到打印效果,例如 [self.tableView recursiveDescription]
7.3 打印寄存器
register read,程序一旦崩溃,可以看看打印寄存器,列出的方法,缩小排查范围。
7.4 LLDB支持python脚本语言
8. 启用僵尸对象检查
ARC下,貌似没什么太大用处了。不过MRC下,这个用处挺大
9. 崩溃类型
9.1 EXC_BAD_ACCESS
在访问一个已经释放的对象或向它发消息时,就会出现
9.2 SIGSEGV
段错误信号,是操作系统产生的一个更严重的错误。可能原因有 硬件出现错误,访问不可读的内存地址,或向受保护的内存地址写入数据。
9.3 SIGBUS
访问的内存是一个无效的内存地址
9.4 SIGTRAP
遇到这种错误时,通常LLDB会自动在相应行代码上暂停
9.5 EXC_ARITHMETIC
除0时,会出现
9.6 SIGILL
非法指令信号
9.7 SIGABRT
中止信号
9.8 看门狗超时
错误码0x8badf00d,常读作ate Bad Food(很像),常见于在同步队列中发请求,阻塞主线程
10. 自定义C函数处理SIGABRT信号
可以看看UncaughtExceptionhandler开源类
11. 断言
建议在发布版本中删除断言,并用其他方式将断言记录在日志系统中。
断言最好总是和if条件匹配
int i = 4;
if (i == 4){
// do something
} else {
NSAssert(NO,@"i 不等于4");
}