当异常出现时

错误类型
•EXC_BAD_ACESS访问一个已经释放的对像或向它发送消息
•SIGSEGV硬件错误,访问不可读的内存地址,受保护的内存地址写入数据。最常见的是不正确的类型转换
•SIGBUS访问无效的内存地址,可能是芯片的地址
•SIGTRAP
•EXC_ARITHMETIC , 算术错误,如除0
•SIGILL(SIGNAL_ILLEAL_INSTRUCTION)
•SIGABART底层错误

在系统抛出异常处设置断点

有时候我们的程序不知道跑到哪个地方就 crash 了,而 crash 又很难重现。
1: 保守的做法是在系统抛出异常之前设置断点,具体来说是在 objc_exception_throw处设置断点。
设置步骤为:首先在 XCode 按 CMD + 6,进入断点管理窗口;
然后点击右下方的 +,增加新的 Add Symbolic Breakpoint。
在 Symbol 一栏输入:objc_exception_throw,然后点击 done,完成。
这样在 Debug 模式下,如果程序即将抛出异常,就能在抛出异常处中断了。

比如在前面的代码中,我让 [firstObjctcrashTest]; 抛出异常。在 objc_exception_throw 处设置断点之后,程序就能在该代码处中断了,我们从而知道代码在什么地方出问题了。

2: 另一个方法是:增加新的Add Exception Breakpoint..., 然后直接点击完成就可.

2.1. 条件断点, 在某个地方点击使之增加一个符号断点,然后右击这个断点符号,点Edit BreakPoint..., 然后在弹出的对话框中的Condition处输入, if i==300  , 这样, 在这个断点运行处,如果当i值为300时, 就会自动断住,而如果不为300时,程序会继续运行。

2.2. 观察某个值的变化, 有时候程序运行了, 但却没有按我们设定的路线运行,如发现某个值变化了,但不知道是在代码中的什么时候变化的, 这个时候调试起来就比较麻烦, 会需要添加许多的log来进行跟踪, 所以使用断点来做这事,就比较简单,在这个值变化前的某个代码处,加断点, 运行代码,当运行到断点处时, 通过console中的variable View去找到这个变量, 右击, 选择, Watch “xxx”, 然后继续运行代码, 当这个值被改变后, 会自动停在改变的地方, 然后就知道问题所在了。

3: 在XCode中按CMD+5,打开Debug Navigator, decompress the thread list, 即把左边底部的滑块滑到最大,以显示全部的线程信息

4: 对于EXC_BAD_ACCESS类型的错误,可以尝试打开Zombie来查找错误

5: 崩溃时,如果使用的是模拟器,则输入:(po是用来打印一个对象的, p可以用来打印一个结构体或简单数据格式如int, float)

寄存器的值,可以直接通过register read来查看。

(lldb) po $eax
(lldb) po [$eax class]
(lldb) po [$eax name]
(lldb) po [$eax reaon]
如果是在真机上,则使用:
(lldb) po $r0
(lldb) po [$r0 class]
(lldb) po [$r0 name]
(lldb) po [$r0 reson]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值