EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=0x0)处理

来源:互联网 发布:数据安全保密管理制度 编辑:程序博客网 时间:2024/06/01 10:40

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 值中的特定位模式来表达某些诊断信息。

 

[cpp] view plain copy
  1. //可以用下面方法  
  2.   
  3. isnan(x)  


第三。

如果你用的是MRC内存管理模式。

可能是:

EXC_BAD_ACCESS code=1

[CALayer release]: message sent to deallocated instance ) 0x12311231
EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=0x0)

原因:重复的release了某个对象

重复的release了某个对象,检查下代码,有没有重复release出现。

或者autorelease的对象比如[UIButton buttonWithType:UIButtonTypeCustom]之类的不需要release的被release过



1 0