【问题标题】:iOS main thread freezes for few secondsiOS主线程冻结几秒钟
【发布时间】:2014-10-06 21:49:32
【问题描述】:

我只在 iOS 8 上看到我的应用程序中的主线程冻结了几秒钟(而不是在以前的 iOS 版本上)。
我在很多地方使用@synchronised (self),并且还使用了 RemoteIO 设置。我的问题是如何调试主线程阻塞的确切位置并获取其他信息,例如它当时在做什么?

我使用的是 Xcode 6,所以请告诉我最好的调试方法。

编辑:这是 Pause 的输出。

【问题讨论】:

  • 查看仪器。
  • 仪器 -> 时间分析器

标签: ios objective-c ios8 objective-c-blocks freeze


【解决方案1】:

作为了解正在发生的事情的第一步,我建议您在冻结时在调试器中按暂停。它会告诉你那个线程正在做什么。

您将看到一个仍在执行的任务,或者 msg_trap 行表明某处有锁。

在这里发布你发现的内容。

【讨论】:

  • 好吧,这让我从早上开始就发疯了。每当我发现主线程在启动时挂起时,我都会暂停。它显示了 13 个待执行的块。它在顶部显示 __semwait_signal,那么主线程是否正在等待某些活动完成?我已经编辑了问题并附上了问题的屏幕截图。
  • 如果我理解正确你在做什么,你对从相机拍摄的视频进行了一些处理。因此,要么处理每一帧花费的时间太长,要么调用回调过于频繁,因此在调用之间它无法做任何事情。我认为这是您的代码,所以现在 Time Profiler 可能会有所帮助。
  • 实际上,我所做的并不昂贵,而且只发生在 iOS 8 中。我确信我在 iOS 8 中发现了一个错误,有时(并非总是)导致主线程进入休眠状态启动时几秒钟。睡眠时间在 1 秒到 15 秒之间变化。我使用了时间分析器,它显示了调用 usleep 的主线程。为什么主线程调用usleep完全是我不明白的。
  • 堆栈跟踪中显示的方法 - 是您的方法吗?你写的吗?它们是黑色的(不是灰色),所以我想你做到了。你能发布一些代码和/或分析器截图吗?
  • 我为这样的问题所做的是将所有@synchronize 语句替换为对锁定/解锁方法的调用。 lock 方法,如果被阻止,将发布它被阻止的时间。 unlock 方法会将阻塞时间(如果有)与当前时间进行比较,如果 delta 超过某个阈值,则转储其自己的线程调用堆栈。
猜你喜欢
  • 1970-01-01
  • 2017-04-06
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多