如果未附加调试器,则React Native应用在启动时无响应

Can*_*ğlu 5 ios react-native

我有一个React Native(0.59.8)应用程序,它在模拟器上可以很好地运行,通过Xcode部署到设备上时可以很好地运行,但是当仅在用户未登录的情况下在应用程序启动时通过TestFlight分发约3分钟时才响应。

这是发生了什么:

  • 我通过TestFlight安装我的应用
  • 开启应用程式。
  • 欢迎页面上有一个“开始使用”按钮,可将用户带到登录屏幕。我点击那个按钮
  • 约2-3分钟无任何反应
  • 应用程序进入登录屏幕,一切开始正常运行。

一些观察:

  • 这仅在TestFlight归档版本上发生,在模拟器上或通过Xcode> Run部署时不会发生。
  • 这会在多个物理设备上发生(尽管这两个设备都是iPhone X,但我们目前没有任何其他设备可以测试)。
  • 当应用程序处于“崩溃”状态时,旋转手机会将一切完美旋转到地面位置。即,该应用程序实际上正在运行,并且对旋转的响应/布局正确。但是,底部的选项卡栏图标布局未正确更改为横向/纵向。
  • 如果用户未登录我的应用程序,并且我终止了该应用程序并重新启动,则会发生相同的问题。
  • 用户登录后,一切正常。
  • 如果我终止了该应用程序并在用户登录后重新启动,则我的主页位于选项卡栏中,并且具有一些可点击的视图。滚动视图完美流畅地滚动,但是选项卡上的按钮栏和可点击的链接不起作用。当我让它停留几分钟后,它崩溃了,并出现了以下来自iPhone的日志Console.app

--

*** Terminating app due to uncaught exception 'RCTFatalException: Unhandled JS Exception: Exception in HostFunction: std::bad_alloc', reason: 'Unhandled JS Exception: Exception in HostFunction: std::bad_alloc, stack:
<unknown>@<null>:<null>
<unknown>@4:3638
value@1033:573
onLayout@1033:1815
y@95:576
P@95:719
E@95:773
M@95:1940
H@95:2699
j@95:2514
<unknown>@95:14003
Ue@95:83341
De@95:13673
We@95:13846
receiveEvent@95:14222
value@28:3311
<unknown>@28:822
value@28:2565
value@28:794
value@<null>:<null>
'
*** First throw call stack:
(0x208f5d27c 0x2081379f8 0x100c2703c 0x100c23574 0x208f64900 0x208e464d0 0x208e47104 0x100c3a6b0 0x100c7a1d4 0x100c79f34 0x20899ca38 0x20899d7d4 0x208978dec 0x20897992c 0x208981e08 0x208b7d114 0x208b7fcd4)
Run Code Online (Sandbox Code Playgroud)
  • 我可以通过向下滑动来刷新主页,它开始刷新(需要一两秒钟来获取数据),但是它永远保持刷新状态。
  • 在“挂起”状态下,我的手机在一两分钟内变得过热,因此我怀疑CPU是否为100%,尽管我不知道如何进行验证。
  • 我只发送每周一次的构建,而上周没有出现这样的问题,并且我已经更改了项目的数百个部分,所以我不确定问题从什么时候开始的,因为在模拟器或设备测试中不会发生通过Xcode。

我的依赖来自package.json

"dependencies": {
    "@babel/runtime": "^7.4.5",
    "@bankify/react-native-animate-number": "^0.2.1",
    "@react-native-community/async-storage": "^1.4.2",
    "@types/algoliasearch": "^3.30.12",
    "@types/react-native-permissions": "^1.1.1",
    "algoliasearch": "^3.33.0",
    "art": "sebmarkbage/art#19/head",
    "base-64": "^0.1.0",
    "global": "^4.3.2",
    "immutability-helper": "^3.0.1",
    "iso-639-1": "^2.0.5",
    "lerna": "^3.14.1",
    "lodash": "^4.17.11",
    "portable-fetch": "^3.0.0",
    "q": "^1.5.1",
    "querystring": "^0.2.0",
    "react": "16.8.6",
    "react-art": "^16.8.6",
    "react-dom": "^16.8.6",
    "react-native": "^0.59.8",
    "react-native-geolocation-service": "^2.0.1",
    "react-native-gesture-handler": "^1.2.1",
    "react-native-intercom": "^13.1.0",
    "react-native-linear-gradient": "^2.5.4",
    "react-native-loading-spinner-overlay": "^1.0.1",
    "react-native-onesignal": "^3.2.14",
    "react-native-permissions": "^1.1.1",
    "react-native-simple-radio-button": "^2.7.3",
    "react-native-static-safe-area-insets": "^1.3.3",
    "react-native-svg": "^9.5.1",
    "react-native-svg-charts": "^5.2.0",
    "react-native-swipeout": "^2.3.6",
    "react-native-web": "^0.11.4",
    "react-native-webview": "^5.10.0",
    "react-navigation": "^3.11.0",
    "react-redux": "^7.0.3",
    "redux": "^4.0.1",
    "redux-api-middleware": "^3.0.1",
    "redux-persist": "^5.10.0",
    "redux-refresh-token": "^0.1.0",
    "reselect": "latest",
    "superagent": "^5.0.5",
    "url": "^0.11.0"
  },
Run Code Online (Sandbox Code Playgroud)

有人遇到过这样的问题吗?可能是什么原因?似乎它与布局和状态更改的某种组合有关,但是我不知道如何调试,因为它仅在存档的“发行版”构建中发生。

更新:我设法附加到Xcode上的调试版本,还有其他一些观察结果:

  • 在性能监视器中,RAM的使用量会永远保持增长。
  • React Javascript线程消耗了整个CPU:

    在此处输入图片说明

  • 当我通过摇晃设备重新加载应用程序时,RAM使用仍然存在。即我的应用程序现在使用的是1.5GB,我重新加载了该应用程序,它没有重置为某些合理的值,它从1.5GB继续并且不断增加。(虽然我杀死并重新打开了应用程序,但显然会重置)

  • 仅RAM(标有RAM的RAM)的使用量在增加。JSC使用为0 MB。这是性能监视器的屏幕截图:

在此处输入图片说明

  • 几分钟后,如果一切正常,则在正常的RAM使用情况下,UI和JS线程均以60fps的速度运行,一切都会变得顺畅。

更新2

  • 当我在Xcode调试器中暂停应用程序时,JS线程始终处于相同的功能:

在此处输入图片说明

  • 在最后一部分,我不是远程调试JS。当我摇动设备并选择“远程调试JS”时,什么也没发生(尽管CPU仍然已满,RAM越来越大)。我暂停了执行,它停留在这里:

在此处输入图片说明

  • 当我尝试重新加载时,它崩溃了,甚至没有响应震动(开发者菜单没有出现)。我杀死了该应用程序,然后重新启动,它卡在初始屏幕上(甚至没有到达欢迎屏幕),再次卡在与先前屏幕截图相同的行上。

  • 不知道是否相关,但是我得到了无尽的错误,例如nw_socket_handle_socket_event [C4.1:1] Socket SO_ERROR [61: Connection refused]在日志中。

更新3:

  • 我启用Debug JS Remotely后,第二天再次启动了我的应用程序,而无需更改代码行,并且它开始没有任何问题。我可以验证运行状况良好的应用程序没有这些问题:

在此处输入图片说明

  • 我禁用了远程JS调试,问题再次出现。我认为这可以解释为什么我在本地测试上没有问题(因为我总是远程调试JS)但是有问题。我将问题标题从更新What is causing a few minutes of touch unresponsiveness on React Native app startReact Native app unresponsive on start if debugger is not attached以反映此问题。

Can*_*ğlu 9

在澄清问题之后(它只挂在没有附加调试器的调试版本中),它就更清楚了。如果未启用远程调试,我已经阅读了本机 ios 应用程序崩溃,事实证明它完全相同:日志导致 JS 线程挂起。如果没有问题,它们会被路由到调试器,但是当没有调试器时,它会使控制台膨胀。

我已将babel-plugin-transform-remove-console脚本添加到我的开发依赖项中,该脚本仅在发布模式下触发,问题就消失了。(如果我没有在调试版本上附加调试器,它仍然会发生,但无论如何我在开发时总是附加一个)

编辑:似乎在升级到 React Native 0.60(以及一些结构性变化)后babel-plugin-transform-remove-console,没有明显的原因或错误停止工作。我已将以下代码添加到我的应用程序的 main 中,index.js以从生产版本中删除日志记录:

if (!__DEV__) {
    global.console.log = () => {}
    global.console.warn = () => {}
    global.console.error = () => {}
}
Run Code Online (Sandbox Code Playgroud)

它完美运行,无需任何插件。

  • 感谢您进行这次急需的健全性检查。Babel 的更新问题总是让我困扰。 (3认同)