在发行版中调试React Native崩溃

时间:2018-03-28 05:51:49

标签: react-native react-native-android

我正在使用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堆栈跟踪非常神秘(可能是由于缩小和捆绑),但它有用地包括_onErrorreact-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(){} 对象还是其他什么?

我将如何进行调试,因为它只在发布中发生?

1 个答案:

答案 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会导致errorconnect失败时被调用两次,因为没有人在听港口。