我有一个React Native(0.59.8)应用程序,它在模拟器上可以很好地运行,通过Xcode部署到设备上时可以很好地运行,但是只有当用户没有在应用程序启动时通过TestFlight分发大约3分钟时,它才响应登录。
发生了什么事
一些观察:
Console.app
中来自iPhone的以下日志:-
*** 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)
我对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"
},
有人遇到过这样的问题吗?可能是什么原因?似乎它与布局和状态更改的某种组合有关,但是我不知道如何调试,因为它仅在存档的“发行”版本中发生。
更新:我设法将其附加到Xcode的调试版本上,其他一些观察结果:
React Javascript线程消耗了整个CPU:
当我通过摇晃设备重新加载应用程序时,RAM使用仍然存在。即我的应用程序现在使用的是1.5GB,我重新加载了该应用程序,它没有重置为某些合理的值,它从1.5GB继续并且不断增加。 (虽然我杀死并重新打开了应用程序,但显然会重置)
仅RAM(标有RAM的RAM)的使用在增加。 JSC使用为0 MB。这是性能监视器的屏幕截图:
更新2 :
当我尝试重新加载时,它崩溃了,甚至没有响应震动(开发者菜单没有出现)。我杀了该应用程序,然后重新启动,它卡在启动屏幕上(甚至没有到达欢迎屏幕),再次卡在上一个屏幕截图的同一行。
不确定是否相关,但是我在日志中遇到诸如nw_socket_handle_socket_event [C4.1:1] Socket SO_ERROR [61: Connection refused]
之类的无尽错误。
更新3:
Debug JS Remotely
,第二天再次启动了我的应用程序,而没有更改任何代码行,并且开始没有任何问题。我可以验证运行状况良好的应用程序没有这些问题:What is causing a few minutes of touch unresponsiveness on React Native app start
更新为React Native app unresponsive on start if debugger is not attached
,以反映此问题。答案 0 :(得分:1)
弄清问题(仅在未附加调试器的调试版本中挂起)后,情况就更清楚了。我已经读过react native ios application crash if remote debug is not enabled,事实证明它是完全一样的:日志导致JS线程挂起。如果没有问题,它们将被路由到调试器,但是当没有调试器时,控制台就会console肿。
我已将babel-plugin-transform-remove-console脚本添加到我的开发依赖项中,该脚本仅在发布模式下触发,问题已解决。 (如果我没有在调试版本上附加调试器,但仍然会在开发过程中始终附加一个调试器,则仍然会发生这种情况)
编辑:似乎在升级到React Native 0.60(以及一些结构性更改)之后,babel-plugin-transform-remove-console
出于没有明显的原因或错误而停止工作。我已将以下代码添加到应用的主index.js
中,以从生产版本中删除日志记录:
if (!__DEV__) {
global.console.log = () => {}
global.console.warn = () => {}
global.console.error = () => {}
}
它运行完美,不需要任何插件。