我正在使用react-native-tcp
Android 并且遇到了无法调试的崩溃。不幸的是,这只发生在发布中。
我得到的堆栈跟踪如下:
E/AndroidRuntime: FATAL EXCEPTION: mqt_native_modules
Process: com.xx.xx, PID: 22986
com.facebook.react.common.JavascriptException: unable to find socket, stack:
d@664:708
_onError@664:4582
<unknown>@664:3790
value@77:1364
value@53:2778
<unknown>@53:1013
<unknown>@53:106
value@53:985
at com.facebook.react.modules.core.ExceptionsManagerModule.showOrThrowError(ExceptionsManagerModule.java:99)
at com.facebook.react.modules.core.ExceptionsManagerModule.reportFatalException(ExceptionsManagerModule.java:83)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.facebook.react.bridge.BaseJavaModule$JavaMethod.invoke(BaseJavaModule.java:345)
at com.facebook.react.cxxbridge.JavaModuleWrapper.invoke(JavaModuleWrapper.java:136)
at com.facebook.react.bridge.queue.NativeRunnable.run(Native Method)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage(MessageQueueThreadHandler.java:31)
at android.os.Looper.loop(Looper.java:145)
at com.facebook.react.bridge.queue.MessageQueueThreadImpl$3.run(MessageQueueThreadImpl.java:196)
at java.lang.Thread.run(Thread.java:818)
现在,Javascript 堆栈跟踪非常神秘(大概是由于缩小和捆绑),但它有助于包含_onError
,其react-native-tcp
实现如下:
TcpSocket.prototype._onError = function(error: string): void {
this._debug('received', 'error');
this.emit('error', normalizeError(error));
this.destroy();
};
normalizeError
上面的调用映射到d
堆栈跟踪中的函数。我知道这一点是因为我检查了构建过程中生成的捆绑文件。
我明白为什么我的代码流会导致一个unable to find socket
事件,但我不明白这个事件最终如何导致应用程序崩溃。如果有帮助,此事件会在本机 (Android) 组件中生成react-native-tcp
并传播到 JS 端。
我希望将此类事件报告给侦听器(如果有),而不是使应用程序崩溃。
通过 React Native 报告的事件是否有可能在某些情况下导致崩溃 - 例如,如果没有侦听器,或者事件是一个Error
对象,或者其他什么?
鉴于它仅在发布时发生,我将如何调试它?
我无法找到一种有效的调试技术,但能够通过良好的打印来调试我遇到的问题。
问题是 NodeJS(显然也是 React Native)有一个我发现很奇怪的行为:当一个error
事件被发出并且没有error
侦听器时,会抛出一个未处理的异常。这记录在NodeJS 文档中:
When an error occurs within an EventEmitter instance, the typical action is
for an 'error' event to be emitted. These are treated as special cases
within Node.js.
If an EventEmitter does not have at least one listener registered for the
'error' event, and an 'error' event is emitted, the error is thrown, a stack
trace is printed, and the Node.js process exits.
const myEmitter = new MyEmitter();
myEmitter.emit('error', new Error('whoops!'));
// Throws and crashes Node.js
我的问题是我正在删除error
代码中的侦听器,因为有一个react-native-tcp
问题导致error
回调在connect
失败时被调用两次,因为没有人在侦听端口。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句