2

我的应用程序与健身追踪器非常相似,并且我在 iphone 5s 和 5c 上重现了以下错误:当我开始跟踪跑步时,在某些条件下,应用程序在后台运行时被杀死。

条件似乎是:

  • 一旦我点击应用程序中的开始跟踪按钮,不超过 2 秒后锁定屏幕
  • 让应用程序在后台运行至少 30 分钟。

我设法在设备上获取了崩溃日志,并将报告符号化,但它没有给我更多提示。它只是提到了接收错误的通用反应原生 js 和 ios 类。

我正在使用 bugsnag 来收集崩溃报告,但在这种情况下它不会提交任何报告(可能是因为应用程序被杀死并且没有时间提交报告)。

  • 有人知道发生了什么吗?
  • 关于如何进一步推动调查的任何想法?
  • 我从崩溃日志中遗漏了什么重要的东西?

谢谢!

崩溃日志中有趣的部分:

Exception Type:  EXC_CRASH (SIGKILL)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note:  EXC_CORPSE_NOTIFY
Termination Reason: Namespace <0xF>, Code 0x8badf00d
Triggered by Thread:  0

xcrun atos -arch arm64 -o appDsyms/4C682DF9-82D7-342C-ABC3-6218A1EED4F6.dSYM/Contents/Resources/DWARF/MyApp -l 0x100074000 0x000000010007b2bc 0x00000001001452f4 0x0000000100145318 0x00000001000aba84

main (in MyApp) (main.m:16)
ksmachexc_i_handleExceptions (in MyApp) (KSCrashSentry_MachException.c:237)
ksmachexc_i_handleExceptions (in MyApp) (KSCrashSentry_MachException.c:233)
+[RCTJSCExecutor runRunLoopThread] (in MyApp) (RCTJSCExecutor.mm:211)

完整的崩溃日志

4

1 回答 1

3

我花了很长时间才明白发生了什么。永远无法从崩溃日志或 bugsnag 中获得任何信息。

不得不用 XCode 长时间分析它以了解发生了什么:我有内存泄漏。如果你的应用程序占用了太多内存,并且在后台运行,那么在某些时候,iOS 会认为它是一个有害的应用程序并简单地杀死它。

问题

简而言之,问题在于 gps 坐标的检索和 UI 上更新的显示(我在其中计算花费的距离、平均速度和其他分析)是有界的。

所以 redux 操作是在后台触发的,而 UI 上没有更新。最重要的是,我将 gps 坐标存储在 redux 存储中,一段时间后,存储在一个巨大的数组中。这导致了很多不必要的处理 + 愚蠢的内存使用。

使固定

我通过分离那些来修复它

  • gps坐标的检索和存储(只需将坐标存储在AsyncStorage中,无需计算动作)

  • UI的更新:每秒更新一次计时器计算花费的时间+每2秒检查一次是否有新的gps坐标,如果有则计算分析

结果

当应用程序处于活动状态时,CPU 和内存使用量显着减少,这仅仅是因为我停止使用 redux 来存储大量数据(它不是为了存储你的 UI 状态而存在的)。

当应用程序在后台运行时,CPU 和内存使用率变得完全平坦,因为我只是在存储东西。

所以我在这个主题上的新知识!.. 聪明,分开关注.. 长期配置文件。如果您有任何内存泄漏,请考虑存储数据的位置和频率。如果您的应用程序在后台运行,请尽可能限制此阶段发生的事情(避免 redux 更新,避免计算,存储以便稍后处理)

于 2017-08-09T11:02:29.110 回答