ios - 如何在 iOS 8.3 中调试 syscall_thread_switch?

标签 ios multithreading debugging

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

这是来自 Xcode 的堆栈跟踪:

enter image description here

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

最佳答案

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

导致解决方案的原因是搜索 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 的更多信息(主要是一些显示他如何设置后台任务的代码片段),我无法回答他们的具体问题,但这应该为人们指明解决问题的正确方向。

关于ios - 如何在 iOS 8.3 中调试 syscall_thread_switch?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30082371/

相关文章:

c# - 每个线程一个 SQLiteConnection?

node.js - 为什么这段特定的代码会在针对远程数据库的运行中退出四分之一,而不是本地数据库?

java - Eclipse 调试器无法识别新的 Java 代码

objective-c - LLDB 等同于 Xcode4.1 中 GDB 中的 `po`?

ios - Sprite 套件场景中来自 Vungle 的视频广告

ios - 当用户将手机切换为静音时,如何防止我的iOS VoIP应用播放音频?

java volatile 数组,我的测试结果与预期不符

ios - iOS 5-如何使用网址播放视频

ios - 重用 ObjectMapper 模型进行多重映射

c++ - 分离线程 : mutex destroyed while busy Error C++