如何获取冻结 iOS 应用程序的错误报告?
How to get error reports of a freezing iOS app?
最近我的 iOS 应用程序出现问题导致应用程序冻结。 UI 没有响应,用户必须终止并重新启动应用程序才能使其再次运行。
在 Google 的 Play 控制台中,我看到了 ANR('Application not responding' 错误)等问题。
但是在 Xcode 不幸的是我没有收到任何报告。 Crashlytics 也没有显示任何报告。
是否有可能以某种方式获得某种类似于 Google 的 Play 控制台中的 ANR 堆栈跟踪的报告?
请注意:
我知道是什么原因导致应用程序在这个特定问题中冻结,也知道如何调试和修复它。什么我
想要的是一个错误报告,以防在质量检查期间没有发现问题,但它是
在用户会话中发生。
冻结版没有发布到App Store,只是为了
测试飞行。
Crashlytics 无法发送由看门狗触发的异常终止。我已经为 Jetsam 终止研究了这个。您将在控制台日志中看到它们。看到这个 link 看门狗崩溃 iOS 生成:Watchdog Unresponsive App。如果有一种方法可以监控主线程是否执行了太长时间的排队操作,您可能会引发致命错误,即在看门狗终止应用程序之前引发致命错误。
UI 无响应的原因可能有多种:
- 一个原因可能是高负载(运行 内存不足,交换 Space)。为了检测这些场景(没有崩溃行为),您需要应用程序性能监控,例如 Firebase. The advantage with Firebase is you don't have to prompt for consent, so you get more data to detect hangs. The Xcode Organizer can provide Hang Rate metrics 如果您有足够的用户同意共享他们的数据(Xcode 11 中的新功能)。
- 另一个原因可能是代码中的逻辑错误。例如,用户触发了手动测试期间遗漏的意外应用程序流程。在这些情况下,可能更难缩小范围,但可以通过事先手动用户测试进行跟踪,例如 TestFlight. You can use In-App Feedback tools (users send you emails) to gather context about the issue or Instabug 获取屏幕截图和高级反馈。
- 另一个原因可能是死锁。例如,如果您使用
DispatchGroup
或 DispatchSemaphore
s 对网络请求进行排队并且请求超时,那么这也可能导致暂停 UI 帧。我也会仔细查看你离开调度组的位置——所有可能的分支都应该有一个 dispatch_group_leave
语句以避免挂在 dispatch_group_wait
.
- 您可以使用 Thread State Trace Instrument 查看系统调用是否阻塞了您的主线程以调试此问题。经典的 iOS 开发建议是仅在主线程上执行 UI 更新并将所有其他逻辑移至后台线程。这可能无法解决根本原因,但可以防止挂起。同样的逻辑适用于核心数据的获取、插入、删除和更新。也将核心数据操作移至网络请求回调中的后台线程。
- 如果您收到崩溃报告,则可以很简单地诊断 Crashlytics 崩溃报告中的 OOM 错误(出现在 Insights 中)。堆损坏也可以从崩溃报告中推断出来,虽然相同行为的元数据可能不同,但它可能会在您尝试重现错误时指向屏幕或操作。
- 如果用户没有事先终止应用程序,Watchdog 无响应的应用程序崩溃可以被拦截并出现在崩溃报告中,但您提到用户终止了应用程序,因此这可能不可用。
iOS 应用程序没有直接等效的 ANR 错误报告,因为只有在检测到足够多的会话时才会汇总挂起率。您可以对应用程序会话 (ServiceNow) 进行屏幕录制,但我不建议这样做,因为它涉及隐私。
研究一下 MetricKit。 iOS 13 是新的。有一个 class 叫做 MXHangDiagnostic
。您可以在您的应用程序中使用它来监控挂起并在您认为合适时报告它们。
最近我的 iOS 应用程序出现问题导致应用程序冻结。 UI 没有响应,用户必须终止并重新启动应用程序才能使其再次运行。
在 Google 的 Play 控制台中,我看到了 ANR('Application not responding' 错误)等问题。
但是在 Xcode 不幸的是我没有收到任何报告。 Crashlytics 也没有显示任何报告。
是否有可能以某种方式获得某种类似于 Google 的 Play 控制台中的 ANR 堆栈跟踪的报告?
请注意:
我知道是什么原因导致应用程序在这个特定问题中冻结,也知道如何调试和修复它。什么我 想要的是一个错误报告,以防在质量检查期间没有发现问题,但它是 在用户会话中发生。
冻结版没有发布到App Store,只是为了 测试飞行。
Crashlytics 无法发送由看门狗触发的异常终止。我已经为 Jetsam 终止研究了这个。您将在控制台日志中看到它们。看到这个 link 看门狗崩溃 iOS 生成:Watchdog Unresponsive App。如果有一种方法可以监控主线程是否执行了太长时间的排队操作,您可能会引发致命错误,即在看门狗终止应用程序之前引发致命错误。
UI 无响应的原因可能有多种:
- 一个原因可能是高负载(运行 内存不足,交换 Space)。为了检测这些场景(没有崩溃行为),您需要应用程序性能监控,例如 Firebase. The advantage with Firebase is you don't have to prompt for consent, so you get more data to detect hangs. The Xcode Organizer can provide Hang Rate metrics 如果您有足够的用户同意共享他们的数据(Xcode 11 中的新功能)。
- 另一个原因可能是代码中的逻辑错误。例如,用户触发了手动测试期间遗漏的意外应用程序流程。在这些情况下,可能更难缩小范围,但可以通过事先手动用户测试进行跟踪,例如 TestFlight. You can use In-App Feedback tools (users send you emails) to gather context about the issue or Instabug 获取屏幕截图和高级反馈。
- 另一个原因可能是死锁。例如,如果您使用
DispatchGroup
或DispatchSemaphore
s 对网络请求进行排队并且请求超时,那么这也可能导致暂停 UI 帧。我也会仔细查看你离开调度组的位置——所有可能的分支都应该有一个dispatch_group_leave
语句以避免挂在dispatch_group_wait
. - 您可以使用 Thread State Trace Instrument 查看系统调用是否阻塞了您的主线程以调试此问题。经典的 iOS 开发建议是仅在主线程上执行 UI 更新并将所有其他逻辑移至后台线程。这可能无法解决根本原因,但可以防止挂起。同样的逻辑适用于核心数据的获取、插入、删除和更新。也将核心数据操作移至网络请求回调中的后台线程。
- 如果您收到崩溃报告,则可以很简单地诊断 Crashlytics 崩溃报告中的 OOM 错误(出现在 Insights 中)。堆损坏也可以从崩溃报告中推断出来,虽然相同行为的元数据可能不同,但它可能会在您尝试重现错误时指向屏幕或操作。
- 如果用户没有事先终止应用程序,Watchdog 无响应的应用程序崩溃可以被拦截并出现在崩溃报告中,但您提到用户终止了应用程序,因此这可能不可用。
iOS 应用程序没有直接等效的 ANR 错误报告,因为只有在检测到足够多的会话时才会汇总挂起率。您可以对应用程序会话 (ServiceNow) 进行屏幕录制,但我不建议这样做,因为它涉及隐私。
研究一下 MetricKit。 iOS 13 是新的。有一个 class 叫做 MXHangDiagnostic
。您可以在您的应用程序中使用它来监控挂起并在您认为合适时报告它们。