4/n Display a RedBox with the JS stack (instead of native stack) when an unhandled JS exceptions occurs

Summary:
Changelog: [iOS][Changed] Display a RedBox with the JS stack (instead of native stack) when an unhandled JS exceptions occurs

-----

# A0) Bridge mode, Unhandled Exception, FBiOS
Unhandled exception goes to FBReactModule, but the JS Stack is not parsed correctly.
https://www.internalfb.com/code/fbsource/[312d5cbdd7278247a84619786b12a44c4400fcc0]/fbobjc/Apps/Wilde/FBReactModule2/FBReactModuleAPI/FBReactModuleAPI/Exported/FBReactModule.mm?lines=1488%2C1493

See `****** FBReactModule handleFatalError` in the logs P539306390, and compare with correct behavior in (A1) in the Test Plan.

https://pxl.cl/2h6h3

{F782257996}

-----

# A) Before diff, rn-tester
Open to rn-tester -> APIs -> Crash Examples -> JS Crash.

Set `RCTParseUnhandledJSErrorStackNatively` to YES.
https://www.internalfb.com/code/fbsource/[98880e52ee78be3614e5d9a2ce3292f6a7b5e413]/xplat/js/react-native-github/React/Base/RCTConstants.m?lines=73

{F783395297}

Reviewed By: sammy-SC

Differential Revision: D40387938

fbshipit-source-id: 2abea657476d3bf61ad5b1c643f129e44c6f3f35
This commit is contained in:
Paige Sun
2022-10-20 21:12:41 -07:00
committed by Facebook GitHub Bot
parent 466ba91657
commit ff398e4e26
10 changed files with 94 additions and 25 deletions
@@ -17,8 +17,10 @@ namespace react {
using facebook::react::JSErrorHandlerKey;
static MapBuffer
parseErrorStack(const jsi::JSError &error, bool isFatal, bool isHermes) {
MapBuffer JsErrorHandler::parseErrorStack(
const jsi::JSError &error,
bool isFatal,
bool isHermes) {
/**
* This parses the different stack traces and puts them into one format
* This borrows heavily from TraceKit (https://github.com/occ/TraceKit)
@@ -99,7 +101,7 @@ JsErrorHandler::~JsErrorHandler() {}
void JsErrorHandler::handleJsError(const jsi::JSError &error, bool isFatal) {
// TODO: Current error parsing works and is stable. Can investigate using
// REGEX_HERMES to get additional Hermes data, though it requires JS setup.
MapBuffer errorMap = parseErrorStack(error, isFatal, false);
MapBuffer errorMap = JsErrorHandler::parseErrorStack(error, isFatal, false);
_jsErrorHandlingFunc(std::move(errorMap));
}