OC中如何调试野指针异常(EXC_BAD_ACCESS(code = ....))

一哥们儿(__weak_Point)把自己在百度的面试题贴到了网上 面试题在百度面试题第八题 ,刚好当初公司面试我的时候也问到了这个问题。(当时没回答上来,最近又看到这个问题,就问总结了一下)

相信很多的人在工作和学习中都会遇到这个问题
这里写图片描述

图中的代码如下,注意代码是再非ARC中运行的

//注意,这些代码是在非ARC下运行的。
    - (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    UIView * view1 = [[UIView alloc]init];
    //View1指向对象的引用计数为0,对象销毁4
    [self freeView:view1];
    //view的对象此时已销毁,出现野指针,程序崩溃
    [view1 setBackgroundColor:[UIColor orangeColor]];
}
//将传过来的对象release掉
- (void)freeView:(NSObject *)obj{
    [obj release];
}

上面的代码很简单,一眼就可以看出什么地方出了问题,但是在实际的工作中,代码逻辑关系都很复杂,如果不小心释放了对象,出现这个问题,找起来是比较麻烦的。尤其是接管别人的代码。

这里就来说一下具体的结局方案

我们知道程序运行的时候,我们创建的对象都是存储在堆内存上的。我们可以通过监测堆内存上内存的变化,来监出现野指针的区域。这样就可以知道在哪里出现了问题。

Xcode 提供了运行程序时记录当前进程 堆内存变化的功能。现在我们打开这个功能,如下图所示。

这里写图片描述

这里写图片描述

然后我们运行程序,注意控制台输出。

这里写图片描述

malocHistory(3491,0x10d8ae300) malloc: stack logs being written into /tmp/stack-logs.3491.114ce0000.malocHistory.TJzvuk.index
malocHistory(3491,0x10d8ae300) malloc: recording malloc and VM allocation stacks to disk using standard recorder
malocHistory(3491,0x10d8ae300) malloc: process 3308 no longer exists, stack logs deleted from /tmp/stack-logs.3308.1126eb000.malocHistory.Kovf7r.index

控制台中说大概意思就是内存非配得历史已经开始记录,被写在了/tmp/stack-logs 文件夹下面。某个进程(process)已经不再存在了。记录他的mallocHistoy文件被删除。

我们到这个目录上看一下。(下面的代码是在我的pro上控制台中输入的,截图太慢了,==\\)

zhangxuongdeMBP:tmp zhangxudong$ cd /tmp
zhangxuongdeMBP:tmp zhangxudong$ ls
KSOutOfProcessFetcher.501.IW-ShwaXJwmHlkfc5wb2ZMHOaJY=
NanoPreferencesSync
PlugInKit-Annotations
com.apple.CoreSimulator.SimDevice.6CAB348C-8E57-4F2A-A2B3-3326F2F84D8D.launchd_sim
com.apple.CoreSimulator.SimDevice.D83EE71A-C375-44A4-8F5F-E704CAED94FE.launchd_sim
com.apple.launchd.0u21btl7qC
com.apple.launchd.Vl0gfUy0kT
com.apple.launchd.YgEnK6wsOi
com.apple.launchd.kXJa1h1Vr9
com.apple.launchd
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值