打破EXC_BAD_ACCESS在XCode中?(Break on EXC_BAD_ACCESS i

2019-09-01 03:36发布

我是新iPhone的开发和XCode中一般,而且不知道如何开始排除故障的EXC_BAD_ACCESS信号。 我怎样才能得到的XCode在导致该错误的确切线断了?


我似乎无法得到的XCode停止对引起问题的线路,但我看到在我的调试控制台下面几行:

太阳10月25日15时12分14秒jasonsmacbook TestProject [1289]:CGContextSetStrokeColorWithColor:无效的上下文

太阳10月25日15时12分14秒jasonsmacbook TestProject [1289]:CGContextSetLineWidth:无效的上下文

太阳10月25日15时12分14秒jasonsmacbook TestProject [1289]:CGContextAddPath:无效的上下文

太阳10月25日15时12分14秒jasonsmacbook TestProject [1289]:CGContextDrawPath:无效的上下文

2009-10-25 15:12:14.680 LanderTest [1289:207] *** - [CFArray objectAtIndex:]:消息发送到释放的实例0x3c4e610

现在,我试图提取我从检索上下文UIGraphicsGetCurrentContext()并传递给,我想拉拢的对象。


进一步的试验和错误调试,我发现一个NSMutableArray我有我的课是一具僵尸的属性。 我走进init为类的函数,这里是我使用的代码:

if ((self = [super init])) {
        NSMutableArray *array = [NSMutableArray array];
        self.terrainBlocks = array;
        [array release];
    }
    return self;    
}

我删除了[array release]行,它不再带给我的EXC_BAD_ACCESS信号,但我现在搞不清楚为什么这个工程。 我认为,当我使用的属性,它会自动保留它为我,因此我应该从内释放它init ,这样我就没有泄漏。 我彻底的困惑是如何工作的,所有的导游和#2的问题,我读过只会混淆我更了解如何我的init()方法中设置属性。 人们似乎没有达成共识,以哪种方式是最好的。

Answer 1:

对于任何EXC_BAD_ACCESS错误,你通常试图将消息发送到一个释放的对象。 追踪这些下来的最好方法是使用NSZombieEnabled 。

该作品以从未真正释放的对象,但通过包装它作为一个“僵尸”,并设置里面一个标志,上面写着它通常会被释放。 这样,如果你尝试再次访问它,它仍然知道那是什么,你做了错误之前,并与信息这一点点,你通常可以原路返回,看看有什么问题了。

它在后台线程尤其有助于在调试器有时胡扯出任何有用的信息。

非常重要必须注意的是,你需要100%确保这是只有在你调试代码,而不是你的发行代码。 因为没有什么是有史以来发布,您的应用程序会泄漏和泄漏和泄漏。 提醒我要做到这一点,我把这篇日志在我的appdelegate:

if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled"))
  NSLog(@"NSZombieEnabled/NSAutoreleaseFreedObjectCheckEnabled enabled!");

如果您需要帮助找到确切路线,做一个构建与调试(CMD-Y),而不是构建与运行(CMD-R)。 当应用程序崩溃,调试器会告诉你到底是哪行,并与NSZombieEnabled组合,你应该能够准确找出原因。



Answer 2:

关于您的阵列。 该生产线

NSMutableArray *array = [NSMutableArray array];

实际上不会给你保留的对象,而是一个自动释放对象。 它可能被保留在下一行,但那么你不应该在第三行释放。 见这

这是基本的规则:

如果使用名称以“黄金”或“新”,或包含“复制”的方法创建它,你需要一个对象的所有权(例如,分配,NEWOBJECT,或mutableCopy),或者如果你向它发送一个retain消息。 您有责任放弃你自己的使用释放或自动释放对象的所有权。 您会收到一个对象的任何其他的时间,你不能释放它。



Answer 3:

>编辑计划 - - >诊断选项卡 - >启用僵尸对象在Xcode 4中,您可以通过点击配置下拉(左上,右旁的停止按钮)使植物大战僵尸



Answer 4:

Xcode中/ GDB老是打断上EXC_BAD_ACCESS ,你只需要你的工作方式调用栈找到触发它的代码。

请注意,这些类型的错误往往会出现autoreleased对象,也就意味着问题的最终原因不会在触发调用堆栈EXC_BAD_ACCESS 。 这时候,NSZombieEnabled和NSAutoreleaseFreedObjectCheckEnabled变得有用。



Answer 5:

一个新的答案,一个古老的线程... XCode中4诊断EXC_BAD_ACCESS例外的最有效的方法是使用仪器来分析您的应用程序(在Xcode点击产品/ Profile,选择植物大战僵尸)。 这将帮助您识别发送到释放对象的消息。



Answer 6:

从斯坦福CS193P类:如果你(手动,通过编辑断点)添加一个断点符号objc_exception_throw你可以得到什么地方出了错更好的图片-让事情继续的地步调试器暂停本身往往掩盖的东西和螺杆向上堆栈跟踪。 当您在objc_exception_throw你可以常常回想正是接入/停止操作造成您的问题。



Answer 7:

另一个有用的方法是设置断点发生异常后,将直接触发:

打开断点窗口(运行 - 展示 - 断点),并添加两个象征性的断点称为“objc_exception_throw”和“[NSException提高]”

来源: http://blog.emmerinc.be/index.php/2009/03/19/break-on-exception-in-xcode/



Answer 8:

只是想增加对谁都是从网上来,搜索对于同样的错误,但不同的错误解决方案等。 在我来说,我得到了同样的错误,当我试图实例化的NSDictionary与键名称拼写错误,我忘了在我的钥匙前面加上“@”:

NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys: myObj1, @"goodKey", myObj2, "badkey @ is missing in front", nil];


Answer 9:

我希望我没有错过一个相同的答案,但我发现,它可能对某些项目抛出这个错误是由于在模拟器上运行较旧版本的iOS可能与项目的依赖或框架不兼容。 我意识到这是刚刚在-older-模拟器版本发生前追逐这些下移太久,喜欢iPhone 4S,应用程序甚至不应该试图支持。

本来是很高兴已经得到了更详细的错误信息,但我想这就是它起源于框架...的责任无论如何,这是一个相当普遍的搜索登陆,也许这将帮助别人消磨了作为严重因为我发现我自己。



Answer 10:

使僵尸之前,我建议先摆脱所有警告(如果您有任何)。 就像没有一个非void函数简单的事情, return可能导致此错误。 如果你没有警告继续为其他答案建议。



文章来源: Break on EXC_BAD_ACCESS in XCode?