【问题标题】:My app freezes but no error appears我的应用程序冻结但没有出现错误
【发布时间】:2012-04-29 02:16:02
【问题描述】:

是否有人知道如果我的应用程序冻结我必须检查什么?我的意思是,我可以在 iPad 屏幕上看到该应用程序,但没有按钮响应。当我单击按钮时,我尝试过调试代码,但我还没有看到任何东西。我正在阅读有关 Instruments 工具的信息;具体如何使用它们?

有人可以帮助我吗?我只需要解释一下如何使用这些工具。

【问题讨论】:

  • 请问如何解决这个问题。你能提供任何线索吗?
  • 完全按照 Ben Baron 的建议行事。暂停后查看 Xcode 的左侧幻灯片并识别可能阻塞 UI 的函数/线程。一次注释掉每个函数并重新运行项目。然后,您将能够确定导致应用冻结的原因。

标签: ios debugging xcode-instruments


【解决方案1】:

听起来你以某种方式阻塞了主线程。要调试,请在调试器中运行应用程序,当应用程序冻结时,点击 Xcode 底部日志区域上方的暂停按钮。然后在左侧,您将能够准确地看到每个线程在做什么,并且您可以看到它卡在哪里。

可能是主线程上的长循环或同步死锁。

【讨论】:

  • 嗨,伙计!但是我应该使用哪种仪器。分配,泄漏,活动监视器,这是我第一次尝试使用仪器,我不知道如何使用它...关于您可能的答案,我想您可能是对的。因为当我单击按钮时,我会调用一个弹出窗口并同时显示另一个视图,弹出窗口有自己的 Web 服务连接,而视图控制器有另一个......
  • 您不使用任何工具,只使用 Xcode。通过单击 Xcode 左上角的运行按钮来运行您的应用程序。这将在调试器中运行。在您的应用程序中导航,直到您重现冻结。然后单击底部日志输出区域上方的小暂停按钮(看起来像||)。它位于日志区域上方的酒吧左侧。一旦你暂停它,你会在左边看到你所有的线程堆栈跟踪,你可以看到它卡在什么方法上。
  • 另外,您使用的是同步还是异步连接到该 Web 服务?您不应在主线程上使用同步(阻塞)网络连接。
  • 非常感谢,我想我发现了可能的错误。这不是应用程序。我不知道你有没有听过关于带有推送技术的光流或类似的东西。在应用程序中安装了一些用于使其工作的库,但是当我单击按钮时,灯光流媒体事件没有响应,因为它在连接返回之前有一个循环,这可能是与服务器的连接丢失了,即原因是我的应用程序正好停在那部分。我的网络连接有问题。
  • 谢谢,在我的情况下,我的第三方音频引擎上有一个丑陋的互斥锁
【解决方案2】:

最佳答案是正确的。您可以使用“暂停”选项进行调试。阻塞主线程的最常见方法是在您调度的同一线程上调用dispatch_sync。有时您从dispatch_once 调用相同的代码。

【讨论】:

    【解决方案3】:

    除了暂停和跟踪堆栈跟踪之外,我认为还有一件事要做,就是检查代码是否有任何导致应用程序冻结的循环。

    我最近遇到了类似的问题,但堆栈跟踪并没有太大帮助,我发现在 layoutsubviews 方法中调用 reloadData() 时出现了一个永恒的循环,这导致了没有错误的冻结,也没有仪器的帮助。

    【讨论】:

      【解决方案4】:

      我的项目中有类似的情况,原因是另一个开发人员在方法layoutSubviews() 中添加了setNeedsLayout(),这会导致无限循环并冻结应用程序。

      【讨论】:

        【解决方案5】:

        同样的问题发生在我的 ios 13.4 上,然后我尝试了上述解决方案,但没有解决,所以我尝试在编译时有一个带有中断约束的元素。所以在解决约束后我尝试解决我的问题。

        【讨论】:

        • 欢迎 @anubhav verma 在 StackOverflow 上,如果您添加一些代码或步骤来解决问题,这将非常有帮助。如需更多帮助,请访问stackoverflow.com/help/how-to-answer
        猜你喜欢
        • 2014-02-21
        • 1970-01-01
        • 2012-06-25
        • 2011-12-21
        • 2013-09-11
        • 2015-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多