EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=0x0) 这种崩溃有时无任何征兆,我们可以打开Product->Scheme->Edit Scheme 按照如下图操作:
run->Diagnostics->Enable Zombie Objects 勾选上
即为: 僵尸模式
重新定位问题,观察控制台是否有提示输出
如果没有继续以下操作(用模拟器调试):
1.还是Edit Scheme,切换到Tab Aguments 配置环境变量MallocStackLoggingNoCompact,NSZombieEnabled,MallocStackLogging
重新定位问题,错位信息里会有一个内存地址,例如:message sent to deallocated instance 0x6497860, 在终端里输入malloc_history 40888 0x6497860 |grep 0x6497860 会出现以下提示
ALLOC 0xfcdff50-0xfce00b7 [size=360]: thread_3bf2a28 |start | main | UIApplicationMain | GSEventRun
| GSEventRunModal | CFRunLoopRunInMode | CFRunLoopRunSpecific | __CFRunLoopRun | __CFRunLoopDoObservers
| __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ | _afterCACommitHandler | _applyBlockToCFArrayCopiedToStack
| ___afterCACommitHandler_block_invoke | __38-[UITableView touchesEnded:withEvent:]_block_invoke |
-[UITableView _userSelectRowAtPendingSelectionIndexPath:] | -[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:] | -[MessageListViewController tableView:didSelectRowAtIndexPath:] | _objc_rootAlloc | class_createInstance | calloc | malloc_zone_calloc
-[MessageListViewController tableView:didSelectRowAtIndexPath:] 这个就是错误的位置
上面是在网上找到的解决方法比较通用
第二。
还有就是 你看一下 是否用0做了除数。
或者是否用0做了被除数。然后用后续得到的数继续运算。
如果继续 就会导致崩溃。 打印一下 会得到NaN.
普及一下NaN
NaN,是Not a Number的缩写。
NaN 用于处理计算中出现的错误情况,
比如 0.0 除以 0.0 或者求负数的平方根。由上面的表中可以看出,对于单精度浮点数,NaN 表示为指数为 emax + 1 = 128(指数域全为 1),且尾数域不等于零的浮点数。IEEE 标准没有要求具体的尾数域,所以 NaN 实际上不是一个,而是一族。不同的实现可以自由选择尾数域的值来表达 NaN,比如 Java 中的常量 Float.NaN 的浮点数可能表达为 01111111110000000000000000000000,其中尾数域的第一位为 1,其余均为 0(不计隐藏的一位),但这取决系统的硬件架构。Java 中甚至允许程序员自己构造具有特定位模式的 NaN 值(通过 Float.intBitsToFloat() 方法)。比如,程序员可以利用这种定制的 NaN 值中的特定位模式来表达某些诊断信息。
- //可以用下面方法
- isnan(x)
第三。
如果你用的是MRC内存管理模式。
可能是:
重复的release了某个对象,检查下代码,有没有重复release出现。
或者autorelease的对象比如[UIButton buttonWithType:UIButtonTypeCustom]之类的不需要release的被release过