核心数据内部方法引起的崩溃(SIGSEGV)

4
我收到了一份崩溃报告,所有崩溃线程的调用堆栈都显示了苹果的代码。从外观上看,Core Data的撤消管理器正在-[NSManagedObject(_NSInternalMethods) _newSnapshotForUndo__] + 356中访问无效指针。我已经谷歌搜索了崩溃点,发现唯一类似的崩溃日志来自Sequel Pro crash log
这是我要查看的特定崩溃日志。是否有希望可以修复它?如何修复?我无法复制出该问题。
Code Type: X86-64 (Native)
Parent Process: launchd [184]

Date/Time: 2010-07-16 18:23:38.505 -0800
OS Version: Mac OS X 10.6.4 (10F569)
Report Version: 6

Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x0000000000000000
Crashed Thread: 0 Dispatch queue: com.apple.main-thread

Application Specific Information:
objc[27141]: garbage collection is ON

Thread 0 Crashed: Dispatch queue: com.apple.main-thread
0 com.apple.CoreData 0x00007fff8602a7c4 -[NSManagedObject(_NSInternalMethods) _newSnapshotForUndo__] + 356
1 com.apple.CoreData 0x00007fff8602a3da -    [NSManagedObjectContext(_NSInternalChangeProcessing) _registerUndoForOperation:withObjects:withExtraArguments:] + 218
2 com.apple.CoreData 0x00007fff8602a2f2 -[NSManagedObjectContext(_NSInternalChangeProcessing) _registerUndoForModifiedObjects:] + 34
3 com.apple.CoreData 0x00007fff85ff9933 -[NSManagedObjectContext(_NSInternalChangeProcessing) _processRecentChanges:] + 1155
4 com.apple.CoreData 0x00007fff86035e72 -[NSManagedObjectContext processPendingChanges] + 18
5 com.apple.CoreData 0x00007fff8604ca1c -    [NSManagedObjectContext(_NSInternalNotificationHandling) _processEndOfEventNotification:] + 108
6 com.apple.CoreData 0x00007fff86029c6e -[NSManagedObjectContext(_NSInternalChangeProcessing) _undoManagerCheckpoint:] + 30
7 com.apple.Foundation 0x00007fff8460784e _nsnote_callback + 167
8 com.apple.CoreFoundation 0x00007fff842d0a90 __CFXNotificationPost + 1008
9 com.apple.CoreFoundation 0x00007fff842bd008 _CFXNotificationPostNotification + 200
10 com.apple.Foundation 0x00007fff845fe7b8 -[NSNotificationCenter postNotificationName:object:userInfo:] + 101
11 com.apple.Foundation 0x00007fff8466f557 -[NSUndoManager _postCheckpointNotification] + 74
12 com.apple.Foundation 0x00007fff8466f3b9 -[NSUndoManager _endUndoGroupRemovingIfEmpty:] + 86
13 com.apple.Foundation 0x00007fff8461ea71 +[NSUndoManager(NSPrivate) _endTopLevelGroupings] + 455
14 com.apple.AppKit 0x00007fff82819945 -[NSApplication run] + 509
15 com.apple.AppKit 0x00007fff828125f8 NSApplicationMain + 364

提前感谢。


请注意,这段内容来自用户的计算机,我似乎无法复制这个问题。 - adib
似乎这种情况发生在我在主线程中创建了一个NSManagedObjectContext并将其传递给后台工作线程(技术上是一个NSOperation子类)之后的那个点(有时候,不总是)。新的上下文是否可能以某种方式获取了主线程上下文的撤消管理器?我应该将NSPersistentStoreCoordinator实例传递给工作线程,让它自己创建上下文吗? - adib
3个回答

4
我终于找到了解决方法——在后台线程保存时不要使用NSManagedObjectContext。 我已经改变了我的方法,仅依赖主线程进行核心数据操作,并且它有效。
一些背景信息,这段代码是Mac OS X的新闻播报员刷新循环的一部分,它是一个RSS阅读器,可以大声朗读文章。 循环的目的是从互联网加载RSS源并从源文章创建新闻频道剧集。

非常感谢您,这也适用于iOS吗? - Nick Toumpelis
@nick,你在iOS上是否遇到了类似的崩溃问题? - adib
是的,我也收到了 @adib 的信息。 - Nick Toumpelis
@adib,你是如何复现这个崩溃的? - attomos
@Mecki NSPrivateQueueConcurrencyType 是10.7及以上版本的,而这个问题是针对10.6.4的。 - adib

0
很难根据您提供的信息确定问题的原因。
看起来可能是上下文和撤消管理器不同步。检查您可能拥有的任何自定义验证代码,以查看是否会在验证失败时将必需属性或关系填充为nil。

虽然没有任何自定义验证代码,至少我自己没有编写过。所有属性都是可选的或具有默认值。 - adib

0

首先,在调试器中设置一个断点在objc_exception_throw上,这会导致你的应用程序在崩溃之前停止。这将为您提供有关崩溃原因的提示。


1
我仍然不知道如何重现崩溃。 - adib

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接