【问题标题】:See what causes deadlock on pthread_mutex_lock查看导致 pthread_mutex_lock 死锁的原因
【发布时间】: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


【解决方案1】:

你的堆栈显然比两帧长,你不能用 pthread_mutex_lock 启动一个线程。所以堆栈帧的截断很明显只是 lldb unwinder 中的一个错误。如果您有 ADC 帐户,请在 bugreporter.apple.com 上提交有关此问题的错误。此外,如果您没有使用最新版本的 lldb,您可以动手尝试一下,也许它修复了您看到的任何错误。您可以并排安装多个 Xcode,这样您就不必删除当前正在使用的 Xcode 来尝试更新的 Xcode。

您也可以尝试其他工具,当您的应用进入此状态时,该工具会为您提供回溯(例如 Instruments 时间分析器),因为它使用不同的展开器。这至少可以让你看到完整的回溯是什么。

【讨论】:

    猜你喜欢
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2018-04-20
    • 2018-06-04
    • 2016-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多