1.使用LLDB进行调试:
1.1 dSYM文件存储于目标相关的调试信息。创建工程时默认创建DSYM文件
工程下DSYM文件:
1.2 断点:
1.2.1 异常断点:程序停在抛出异常的哪行,而不会崩溃在MAIN函数里。
1.2.2符号断点:在symbol里设置关注的符号
使用malloc_error_break 和[NSObject doesNotRecognizeSelector:]对调试内存相关的崩溃相当帮助,等效异常断点。
1.2.3编辑断点:
断点导航面板中 ctrl+点击断点 进行编辑。进行状态设置,比如循环i<1000,可以设置断点 i=500时起作用。而不用遍历到500次。
1.3LLDB控制台
1.3.1 打印标量变量
处理整形或结构体用p
p(int) self.maAge
p (CGPoint) self.view.center
po 打印对象
expr 可以在调试时动态执行指定表达式,并将结果打印出来。常用于在调试过程中修改变量的值。
call
call即是调用的意思。其实上述的po和p也有调用的功能。因此一般只在不需要显示输出,或是方法无返回值时使用call。 和上面的命令一样,我们依然在viewDidLoad:里面设置断点,然后在程序中断的时候输入下面的命令:
call [self.view setBackgroundColor:[UIColor redColor]]
继续运行程序,看看view的背景颜色是不是变成红色的了!在调试的时候灵活运用call命令可以起到事半功倍的作用。
常见问题
上面我们简单的学习了如何使用LLDB命令。但有时我们在使用这些LLDB命令的时候,依然可能会遇到一些问题。
不明类型或者类型不匹配
比如下面这个命令。
(lldb) p NSLog(@"%@",[self.view viewWithTag:1001])
error: 'NSLog' has unknown return type; cast the call to its declared return type
error: 1 errors parsing expression
如果在使用LLDB命令中发现有 unknown type 的类似错误(多见于id类型,比如NSArray中某个值),那我们就必须显式声明类型。比如上面这个命令,我们得这么修改。
p (void)NSLog(@"%@",[self.view viewWithTag:1001])
1.3.2打印寄存器
register read
1.3.3调试脚本编程 适合Python程序员
1.4 NSZombieEnabled标识
利用僵尸对象显示日志到调试器,在非ARC作用很大。在Xcode->Product-> scheme 选择Enable Zombie Objects开启。
1.5不同类型崩溃
EXC_BAD_ACCESS:访问一个被释放的对象或向它发送消息时。
SIGSEGV:常见原因是不正确的类型转换。
SIGBUS:代表无效内存访问。
SIGTRAP:陷进信号,并非崩溃信号。收到原因不明的SIGTRAP,先清除上次的输出,然后重新构建通常能解决问题。
SIGABRT:中止信号。当SIGABRT出现时,控制台通常会输出大量的信息,说明具体哪里出错了。由于它是可控制的崩溃,在LLDB控制台输入bt命令打印回溯信息。
看门口超时: 固定错误码:0x8badf00d.出现在同步网络调用而阻塞主线程的时候。
1.6 断言&&异常:有效的防止程序错误。
异常出现时会中止程序。
可用来记录崩溃日志。
1.7 收集崩溃报告
iTunes Connect下载崩溃报告。
第三方崩溃报告服务:
集成SDK,负责上传dSYM文件到他们自己的服务器。
免费:TestFlight 桌面客户端
付费:HockyApp
参考文章:
http://my.oschina.net/u/1244672/blog/615445?fromerr=8f1t5RAh
http://my.oschina.net/u/2340880/blog/665265
http://my.oschina.net/u/1244672/blog/650633?fromerr=bQnCwLIu#OSC_h1_4
Crash文件解析:
http://ios.jobbole.com/82120/