EXC_BAD_ACCESS 查错步骤

EXC_BAD_ACCESS, objc_msgSend, 

此类报错往往来的莫明奇妙.

原因往往是内存过度释放导致, 即多写了release;

至于是哪里多写了release, 很难查知, 以下及为查询方法.

EXC_BAD_ACCESS 查错步骤

工具/原料

  • Xcode5.1.1
  • Xcode 自带开发工具 Instrument6.0

方法/步骤

  1. Xcode -> Product -> Scheme -> EditScheme;

    增添MallocStackLogging和NSZombieEnabled两个环境变量;

    分别用于记录内存alloc和监控zombie内存.

    EXC_BAD_ACCESS 查错步骤
  2. 重新运行项目至崩溃点. 此时程序会打印额外的关于内存的日志

    程序崩溃点得到如下日志:

    --------------------------------------------------------------------------------------------------

    2014-09-30 10:24:38.753 P2PCamLive[280:20505] 

    *** -[UILabel release]: message sent to deallocated instance 0x17eb9800

    --------------------------------------------------------------------------------------------------

    可知, 是由于UILabel dealloc时崩溃, 基本确定是过度释放内存导致.

  3. 打开Instruments工具:

    Xcode -> Open Developer Tool -> Instruments, 

    选择Zombies类型.

    EXC_BAD_ACCESS 查错步骤
  4. 重新启动运行Project, 先不要执行到崩溃点.

    在打开的Instruments工具中choose要检查的程序名称;

    然后点击Instruments左上角的record按钮, 开始记录内存使用情况.

    EXC_BAD_ACCESS 查错步骤
    EXC_BAD_ACCESS 查错步骤
  5. 继续执行程序至崩溃点.

    程序执行到第40秒报出zombie Messaged错误;

    点击图中圈选的">"查看内存详情.

    EXC_BAD_ACCESS 查错步骤
  6. 分析内存调用详情:

    排除操作系统retain, release的部分,

    可知是由于CameraLiveViewController执行dealloc, 

    对内存0x180d5420多调用了release.

    EXC_BAD_ACCESS 查错步骤
  7. 综合以上结果:

    可知是存在于CameraLiveViewController中的一个UILabel多执行了release.

    此时可添加代码对CameraLiveViewController中的可疑UILabel打印日志.

    重新执行上述过程, 对比打印UILabel与Zobmie内存的地址, 

    从而定位出错位置.

    EXC_BAD_ACCESS 查错步骤

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值