【问题标题】:How to debug syscall_thread_switch in iOS 8.3?如何在 iOS 8.3 中调试 syscall_thread_switch?
【发布时间】:2015-05-06 16:25:15
【问题描述】:

自从迁移到 iOS 8.3 后,我遇到了这个错误,主线程会卡在这个调用中。其他一些线程也被困在该调用中。在导致此调用的任何线程中都没有我的代码,所以我很难理解为什么会发生这种情况。有时在点击按钮栏项目时随机发生,有时在重绘图表时(使用 ShinobiCharts)等。

这是来自 Xcode 的堆栈跟踪:

任何人都知道为什么会发生这种情况以及如何解决它?这很烦人,因为当我卡在那里时,我必须重新启动应用程序。请注意,到目前为止,这正在模拟器中发生。我正处于开发这个应用程序的早期阶段,大部分时间都在模拟器上。我还没有在真实设备上看到该错误发生,但我也没有经常在设备上运行该应用程序。

【问题讨论】:

  • 遇到此线程锁时在 lldb 中暂停并在调试器中键入 bt all 以显示完整的内存堆栈并在此处发布日志。
  • 我也面临同样的问题。@nemesys 你找到解决办法了吗
  • @JAL 一旦再次发生就会这样做。就像我之前说的,我无法可靠地复制它,所以可能需要一段时间才能找到痕迹。
  • gist.github.com/Shalmezad/65ff89d20aa7e0a9d094 如果您设法找到某些东西,我们也非常感谢您快速解释如何找到它。
  • @Shalmezad 我认为我们面临着同样的问题。请看这个帖子stackoverflow.com/questions/30269243/…

标签: ios multithreading debugging


【解决方案1】:

敲木头,但我想我想通了(至少在我的例子中)。

导致解决方案的原因是搜索 syscall_thread_switch,这让我在这里得到了这个答案: https://stackoverflow.com/a/30333203/978509

如果您查看我链接的回溯 (https://gist.github.com/Shalmezad/65ff89d20aa7e0a9d094),每个 syscall_thread_switch 前面都有 OSSpinLockLockSlow,答案指出 看起来 像 Livelock,但由于 CPU 使用率低,是更明显的僵局。

通过我的代码,我发现对于每个后台任务,我每次都创建一个新的 dispatch_queue_t。从那以后,我重新设计了使用相同队列的工作原理,这似乎解决了这个问题。

如果没有来自 nemesis 的更多信息(主要是一些代码 sn-ps 显示他如何设置后台任务),我无法回答他们的具体问题,但这应该为人们指明解决问题的正确方向。

【讨论】:

  • 好吧,我的代码中有 2 个队列,一个并发队列,一个串行队列。它们都由我的应用程序代表管理,我很肯定我没有创建任何其他人。但是,我正在使用 ShinobiCharts,他们正在做一些后台处理。这可能是他们的代码,但我不知道。我已经通知了他们,但还没有收到他们的消息。
猜你喜欢
  • 1970-01-01
  • 2015-06-14
  • 1970-01-01
  • 2012-06-19
  • 1970-01-01
  • 2019-10-19
  • 2016-12-18
  • 2015-06-14
  • 2015-11-19
相关资源
最近更新 更多