Xcode崩溃问题调试 signal SIGABRT&EXC_BAD_ACCESS

在进行app开发过程中会遇到很多的问题,各种崩溃令人相当头疼。当然,解决bug的能力也体现了一个程序员的水平,现在来说一说开发中经常遇到的崩溃问题吧。

常见崩溃问题: 一是signal SIGABRT, 二是EXC_BAD_ACCESS.

一、signal SIGABRT 出现这样的崩溃一般有两个原因:1. 数组越界

输入:

    NSArray *array = [NSArray arrayWithObject:@"0"];

    NSString *str = [array objectAtIndex:1];

    NSLog(@"%@",str);

运行崩溃:

打印的崩溃信息:

Terminating app due to uncaught exception ‘NSRangeException‘, reason: ‘*** -[__NSArrayI objectAtIndex:]: index 1 beyond bounds [0 .. 0]‘,很明显给出的崩溃信息是数组越界,此时要仔细检查程序中的数组问题

  2.调用的方法不存在:

输入:

[self performSelector:@selector(haha)];

运行崩溃,崩溃信息:

unrecognized selector sent to instance 0x7fcd584a1ae0

Terminating app due to uncaught exception ‘NSInvalidArgumentException‘, reason: ‘-[ViewController haha]: unrecognized selector sent to instance 0x7fcd584a1ae0‘

说明该方法并不存在,所以造成崩溃

二、EXC_BAD_ACCESS一般是内存访问出错,对象内存已经释放,但仍然在访问会造成这样的后果

举个例子,在进行视频截图时,

generator是图片资源生成器
[generator generateCGImagesAsynchronouslyForTimes:@[currentSnipTime] completionHandler:^(CMTime requestedTime, CGImageRef  _Nullable image, CMTime actualTime, AVAssetImageGeneratorResult result, NSError * _Nullable error) {

        NSLog(@"生成完成");
        //主线程更新UI  如果是异步任务 : 在当前线程中继续执行,而不会等待该代码块执行完毕,也就是跳过了赋值的代码,造成野指针
        dispatch_sync(dispatch_get_main_queue(), ^{
            //EXC_BAD_ACCESS 野指针  访问不能使用的内存地址
            self.snipImageView.image = [UIImage imageWithCGImage:image];
        });
    }];

所以当崩溃信息中出现了EXC_BAD_ACCESS这样的信息,可以分析哪些属性用weak修饰,或者线程异步/同步问题。当然我们还可以借助Xcode工具 点击Xcode的菜单:Product->Profile,启动Instruments 在Instruments模板中选择Zombies,它能把已释放的内存暂时保留,再次访问时会报告错误,并给出该块内存曾经的一些使用信息,帮助我们快速定位。

时间: 2024-10-26 17:17:04

Xcode崩溃问题调试 signal SIGABRT&EXC_BAD_ACCESS的相关文章

ios中的奇怪崩溃Signal和EXC_BAD_ACCESS错误分析

什么是Signal 在计算机科学中,信号(英语:Signals)是Unix.类Unix以及其他POSIX兼容的操作系统中进程间通讯的一种有限制的方式.它是一种异步的通知机制,用来提醒进程一个事件已经发生.当一个信号发送给一个进程,操作系统中断了进程正常的控制流程,此时,任何非原子操作都将被中断.如果进程定义了信号的处理函数,那么它将被执行,否则就执行默认的处理函数. 在iOS中就是未被捕获的Objective-C异常(NSException),导致程序向自身发送了SIGABRT信号而崩溃. Si

XCode 4 的调试定位技巧

给跪了,相当好用: http://superwanc.diandian.com/post/2013-09-12/40052870537 经常有朋友会问Crash的问题.Crash最多的无非就两种,一种就是signal SIGABRT,大概的意思就是发送Message出现问题,信号迷失了.这种的Crash其实是很好定位,Crash了后直接看Console里出的最后日志,比如这段: 2012-03-28 19:26:33.055 TableViewMenuDemo[3916:f803] *** Te

XCode的一些调试技巧搜集

XCode 内置GDB,我们可以在命令行中使用 GDB 命令来调试我们的程序.下面将介绍一些常用的命令以及调试技巧. po 命令:为 print object 的缩写,显示对象的文本描述(显示从对象的 description 消息获得的字符串信息). 比如: 上图中,我使用 po 命令显示一个 NSDictionary 的内容.注意在左侧我们可以看到 dict 的一些信息:3 key/value pairs,显示该 dict 包含的数据量,而展开的信息显示 isa 层次体系(即class 和 m

xcode 真机调试 failed to get the task for process xxx

此错误原因是,使用 in house profile 签名了真机调试的证书: 在 target---build settings----code sign 把 in house profile 改成 dev profile 开发测试用的: xcode 真机调试 failed to get the task for process xxx,布布扣,bubuko.com

Xcode开发和调试总结

Xcode是iOS开发主要的工具.IDE.关于Xcode的细枝末节,可以参考苹果的官方文档或者众多的说明.此文档主要涉及常用开发和调试注意事项,参考版本为Xcode 5.1.1. 目标设置: 在此,我就不区分Project和Target了,这两方面有很多共同的设置,所以只需要了解需要设置哪些子项就可以了. Deployment Target:设置支持的最低设备版本,这个根据代码的API支持情况而定 Base SDK:理论上应该设置为最新版本的SDK,以支持最高版本 Identity:设置Bund

Xcode 真机调试报错:This application's application-identifier entitleme

    This application's application-identifier entitlement does not match that of the installed application. These values must match for an upgrade to be allowed 解决方法:1.Xcode-Window->Devices2.选中你的设备,在右边的installed Apps中删除这个App3.重新编绎即可 Xcode 真机调试报错:This

Xcode真机调试报错(证书的签发者无效)

Xcode真机调试时报错: dyld: Library not loaded: @rpath/libswiftAVFoundation.dylib Referenced from: /var/mobile/Containers/Bundle/Application/A54D1688-B528-4606-9E02-B51433425FB7/LoveFreshBeen.app/LoveFreshBeen Reason: no suitable image found.  Did find: /pri

iOS支付宝集成后出现崩溃的调试总结

前两天的项目中 [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) { NSLog(@"reslut = %@",resultDic); }];在运行到这的时候就崩溃了 就崩溃在这个函数,估计在支付宝的SDK里面崩溃,由于支付宝SDK封装了,所以崩溃在这个接口,当时有三个控制器有支付宝支付,其他的两个控制器没有崩溃现象 调试方法

Xcode真机调试出现The account '***' has no team with ID '***'的解决方案

前段时间,想用真机调试的时候出现 The account '***' has no team with ID '***'的问题, 以前页真机调试过,没有这种情况,于是我登陆开发者中心,进去发现说我的账号有问题: There may be a problem with your account. Please contact us. 于是我就查看了我的icloud邮件,大概在几天前有这么一封apple发送的邮件: Dear ***, You have revoked your certificat