Bug

常见Bug原因及解决方案?


1、app试图调用了不存在的方法。检查对象的类型是否正确以及它是否有这个名称的方法


2、堆栈跟踪或回溯,查看左边线程里所有已经被执行的方法,如果你的代码使用了队列或后台线程,那么app可以快速定位相应线程。崩溃日志上有很多有用的信息,包括应用是什么情况下闪退的。通常,上面有每个正在执行线程的完整堆栈跟踪信息,所以你能从中了解到闪退发生时各线程都在做什么,并分辨出闪退发生在哪个线程上。


3、全局设置异常断点断点,原理就是捕获信号量和异常,然后把调用栈打出来


4、EXC_BAD_ACCESS内存管理问题。与内存相关的崩溃源头是很难定位到的,因为罪魁祸首很可能是程序之前已经执行过的。如果发生故障的代码片段破坏了内存结构,导致了直到很久以后此结果才会出现在一个完全不同的地方


5、试图读取不存在的对象,典型的读取数组


6、在调试窗格告知我们异常发生原因之前,异常断点就已经暂停了程序


7、读取字典不存在的键被当成未知的键,导致崩溃


当程序被发现正在做一些它不该做的事时,就会发生异常,导致崩溃


崩溃的发生分两种情况:SIGABRT(也称为EXC_CRASH),EXC_BAD_ACCESS(也可以显示在SIGBUS或SIGSEGV的名字下)。


SIGABRT是很好解决的,因为它是可控的。终止该app的原因是系统发现这个app做了一些未经允许的事,而且SIGABRT崩溃发生时通常都会在Xcode的调试输出窗格(窗口的右下角)输出一个错误消息。相反,EXC_BAD_ACCESS难解决很多,因为它只发生在应用损坏的状态下,通常是由内存管理问题引起的。


8、如果你没有把需要花费时间比较长的操作(如网络访问)放在主线程上就很容易导致你的应用响应不够快,进而操作系统会终止你的应用,造成崩溃


9、设备检测到低内存,虚拟内存系统发出通知请求应用释放内存。这些通知发送到所有正在运行的应用和进程,试图收回一些内存,低内存崩溃报告


10、SIGABRT是系统报错


11、EXC_BAD_ACCESS 大多数时候是内存提前释放而引起的问题,或者访问的方法不存在引起的


收集用户的崩溃日志了解关于闪退的详尽有用的信息?


1、fir的BugHD


2、巧神推荐的Fabric


Instruments工具的使用?


1、使用Allocations来检测内存和堆栈信息


2、使用Leaks检测内存的使用情况,包括内存泄露问题


3、使用Zombies来检测过早释放的僵尸对象,通过它可以检测出在哪里崩溃的。


4、使用Time Profiler来检测CPU内存使用情况

你可能感兴趣的:(Bug)