iOS 调试技巧

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");

  }

12. oc程序中,不建议使用@throw和@catch捕获异常,还是用断言吧(如果是发布版本,则记录在日志系统中)

13. 收集崩溃报告,第三方崩溃报告服务,QuincyKit(收费),TestFlight(免费)

原文地址:https://www.cnblogs.com/oumygade/p/4528876.html