调试器在核心数据保存时停止,但没有错误输出
Posted
技术标签:
【中文标题】调试器在核心数据保存时停止,但没有错误输出【英文标题】:Debugger stops on core data save but no error output 【发布时间】:2012-03-20 19:38:36 【问题描述】:我有一个简单的方法,它只需要两个托管对象 ID,为它们提取托管对象,建立关系,然后将它们保存到托管对象上下文中。
当我在 managedObjectContext 上执行保存时,调试器在保存行上停止,并带有一个引用 nsmanagedObjectContext 保存的 objc_exception_throw。尽管在输出的 nserror 对象中没有任何输出,但可以向我提供有关引发异常的原因的任何详细信息。看起来这个保存确实可以正常工作,这使得这更加混乱。
这是有问题的方法...
- (void)relateLocationToInvite:(NSManagedObjectID *)locationID :(NSManagedObjectID *)inviteID
NSManagedObject *invite = [self.managedObjectContext objectWithID:inviteID];
NSManagedObject *locationObj = [self.managedObjectContext objectWithID:locationID];
Location *location = (Location *)locationObj;
[invite setValue:location forKey:@"location"];
NSError *error = nil;
if( ![self.managedObjectContext save:&error] )
NSLog(@"Error relating a location to an invite %@",error);
【问题讨论】:
如果异常确实是从 Core Data 堆栈中的某个地方抛出的,error
变量很可能没有机会被设置。在验证失败等情况下会返回错误,但如果遇到内部不一致错误等,则会抛出异常,而不会向错误对象写入任何有意义的内容。
如果您还没有,您可以设置一个异常断点来尝试在创建异常时捕获它,而不是等待它被抛出。这可能会给你更多关于即将发生的崩溃的背景。您还可以在调试控制台中使用bt
命令来获取故障的堆栈跟踪。这只是一般性建议,因为如果不了解您的项目,很难判断可能出了什么问题。
【参考方案1】:
如果应用程序在save:
方法之后继续执行而没有任何问题(即没有抛出任何未捕获的异常并且没有报告任何错误),则意味着保存操作的实现已经捕获了异常并决定默默地忽略它。
为什么会发生这种情况尚不清楚:可能实现依赖于异常来报告内部错误(这不是 Objective-C 异常应该使用的方式,但其他一些语言更多地使用异常)。只要异常在到达你自己的代码之前被捕获,你就不用担心它。
如果您想知道异常的原因,您可以在objc_exception_throw
上中断并使用以下调试器命令:
po *(id *)($ebp + 8)
这将显示在 ios 模拟器(x86 架构)中赋予函数的NSException *
参数。在设备(arm 架构)上,使用(如果我的记忆正确的话)可以实现相同的结果:
po $r0
【讨论】:
那么忽略这个安全吗?顺便说一句,它可以通过更新已被另一个上下文从持久存储中删除的对象来触发。以上是关于调试器在核心数据保存时停止,但没有错误输出的主要内容,如果未能解决你的问题,请参考以下文章