【发布时间】:2023-03-27 23:56:01
【问题描述】:
我有一个在后台进程中使用私有队列并发的 Core Data iOS 应用程序。我遇到了一个死锁,导致 UI 不时冻结(老实说,相当经常) - 但我从调试器 (LLDB) 获得的所有信息都是它卡在 pthread_mutex_lock 上。堆栈跟踪不长,这使得调试几乎不可能:
thread #1: tid = 0x2503, 0x3b5060fc libsystem_kernel.dylib`__psynch_mutexwait + 24, stop reason = signal SIGSTOP
frame #0: 0x3b5060fc libsystem_kernel.dylib`__psynch_mutexwait + 24
frame #1: 0x3b44f128 libsystem_c.dylib`pthread_mutex_lock + 392
XCode 进程窗格同样只显示堆栈中的这两个条目。
我对这个多线程的东西很陌生,所以完全不知从哪里开始解决这个问题。关于如何调试这个有什么建议吗?
【问题讨论】:
-
这里没有足够的信息来回答这个问题。在 iOS 5 上使用 NSFetchedResultsController 时会发生这样的锁,因为它在父上下文上锁定了它不应该拥有的锁 - 然后导致后台上下文在尝试通过父上下文保存时陷入死锁情况。但在你的特殊情况下,这里还不够。
-
我的问题是“我该如何调试它?”关于导致它的原因,我真的没有比你更多的信息了!
-
查看调试器中的其他线程并查看它们在哪些点停止 - 如果存在锁定情况,表明还有其他两件事在等待获取已锁定的资源 - 所以你应该得到堆栈等待的其他事物的痕迹。如果您在调试器中看不到任何内容,只需将 NSLog 语句放在整个代码中并观察控制台以查看发生时记录的内容。您可以在此处添加用于处理背景上下文的代码,有人可能会发现一些问题 - 尽管这通常说起来容易做起来难。
标签: xcode multithreading core-data lldb