【问题标题】:Crash (SIGSEGV) in Core Data internal methodsCore Data 内部方法中的崩溃 (SIGSEGV)
【发布时间】:2010-07-20 17:42:26
【问题描述】:

我收到了一份崩溃报告,崩溃线程的调用堆栈都显示了 Apple 的代码。从表面上看,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

提前致谢。

【问题讨论】:

  • 请注意,这来自用户的机器,我似乎无法复制该问题。
  • 这似乎发生在我在主线程中创建 NSManagedObjectContext 并将其传递给后台工作线程(从技术上讲,是 NSOperation 子类)之后。新上下文是否有可能以某种方式获取主线程上下文的撤消管理器?我是否应该将 NSPersistentStoreCoordinator 实例传递给工作线程并让它创建自己的上下文?

标签: cocoa core-data crash crash-dumps segmentation-fault


【解决方案1】:

我终于找到了解决这个问题的方法——只需don't use NSManagedObjectContext in a background thread that saves。我已经改变了我的方法,只依赖于 Core Data 操作的主线程并且它可以工作。

对于一些背景信息,此代码是 News Anchor for Mac OS X 刷新周期的一部分,这是一个 RSS 阅读器,可以大声读取提要。该循环的目的是从 Internet 加载 RSS 提要,并根据提要文章创建新闻频道片段。

【讨论】:

  • 非常感谢 - 这是否也适用于 iOS?
  • @nick 你在 iOS 中遇到过类似的崩溃吗?
  • 是的,我得到了同样的@adib。
  • @adib 你是如何复制这个崩溃的?
  • @Mecki NSPrivateQueueConcurrencyType 是 10.7+ 而这个问题是针对 10.6.4
【解决方案2】:

鉴于您所掌握的信息,很难说是什么导致了问题。

看起来可能是上下文和撤消管理器不同步了。检查任何您可能需要的自定义验证代码,如果验证失败,它是否会填充所需的属性或与 nil 的关系。

【讨论】:

  • 虽然没有任何自定义验证代码.. 至少没有我自己编写的。所有属性要么是可选的,要么具有默认值。
【解决方案3】:

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

【讨论】:

  • 我仍然不知道如何重现崩溃。
猜你喜欢
  • 2012-05-02
  • 2016-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-29
相关资源
最近更新 更多