调试器在核心数据保存时停止,但没有错误输出

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

【讨论】:

那么忽略这个安全吗?顺便说一句,它可以通过更新已被另一个上下文从持久存储中删除的对象来触发。

以上是关于调试器在核心数据保存时停止,但没有错误输出的主要内容,如果未能解决你的问题,请参考以下文章

调试器不会因错误而停止

保存时的核心数据问题[关闭]

Xamarin App在调试时运行但在发布时崩溃

多线程违规核心数据

核心数据:SQLite 没有立即更新

VS 代码在调试控制台中不显示 Flutter 错误