我正在使用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
函数。我知道这是因为我检查了构建期间生成的捆绑文件。
我理解为什么我的代码流会导致react-native-tcp
事件,但我不明白这个事件最终会导致应用程序崩溃。如果有帮助,则此事件在Error
的本机(Android)组件中生成并传播到JS端。
我希望将这样的事件报告给听众(如果有的话),而不是让应用程序崩溃。
通过React Native报告的事件是否有可能在某些情况下导致崩溃 - 例如如果没有监听器,或者事件是@Test(priority=1)
public void t1(){}
@Test
public void t0(){}
@Test(priority=2)
public void t2(){}
@Test(priority=3)
public void t3(){}
对象还是其他什么?
我将如何进行调试,因为它只在发布中发生?
答案 0 :(得分:1)
我无法找到一种有效的调试技术,但是能够调试我用好的打印件所遇到的问题。
问题是NodeJS(显然也是React Native)有一个我发现特殊的行为:当发出error
事件并且没有error
侦听器时,会抛出未处理的异常。这在this link:
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
侦听器,因为NodeJS documentation会导致error
在connect
失败时被调用两次,因为没有人在听港口。