diff --git a/android/src/main/java/com/facebook/flipper/plugins/crashreporter/CrashReporterPlugin.java b/android/src/main/java/com/facebook/flipper/plugins/crashreporter/CrashReporterPlugin.java index 1326dd202..30a655fd5 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/crashreporter/CrashReporterPlugin.java +++ b/android/src/main/java/com/facebook/flipper/plugins/crashreporter/CrashReporterPlugin.java @@ -1,14 +1,13 @@ /** * Copyright (c) Facebook, Inc. and its affiliates. * - *

This source code is licensed under the MIT license found in the LICENSE file in the root - * directory of this source tree. + * This source code is licensed under the MIT license found in the LICENSE + * file in the root directory of this source tree. */ package com.facebook.flipper.plugins.crashreporter; import android.app.Activity; import android.support.annotation.Nullable; -import com.facebook.flipper.core.FlipperArray; import com.facebook.flipper.core.FlipperConnection; import com.facebook.flipper.core.FlipperObject; import com.facebook.flipper.core.FlipperPlugin; @@ -57,15 +56,18 @@ public class CrashReporterPlugin implements FlipperPlugin { public void sendExceptionMessage(Thread paramThread, Throwable paramThrowable) { if (mConnection != null) { FlipperConnection connection = mConnection; - FlipperArray.Builder builder = new FlipperArray.Builder(); - for (StackTraceElement stackTraceElement : paramThrowable.getStackTrace()) { - builder.put(stackTraceElement.toString()); + StringBuilder strBuilder = new StringBuilder(""); + StackTraceElement[] elems = paramThrowable.getStackTrace(); + for (int i = 0; i < elems.length; ++i) { + strBuilder.append(elems[i].toString()); + if (i < elems.length - 1) { + strBuilder.append("\n\tat "); + } } - FlipperArray arr = builder.build(); connection.send( "crash-report", new FlipperObject.Builder() - .put("callstack", arr) + .put("callstack", strBuilder.toString()) .put("name", paramThrowable.toString()) .put("reason", paramThrowable.getMessage()) .build()); diff --git a/iOS/Plugins/FlipperKitCrashReporterPlugin/FlipperKitCrashReporterPlugin/FlipperKitCrashReporterPlugin.mm b/iOS/Plugins/FlipperKitCrashReporterPlugin/FlipperKitCrashReporterPlugin/FlipperKitCrashReporterPlugin.mm index eba09b397..e1a801533 100644 --- a/iOS/Plugins/FlipperKitCrashReporterPlugin/FlipperKitCrashReporterPlugin/FlipperKitCrashReporterPlugin.mm +++ b/iOS/Plugins/FlipperKitCrashReporterPlugin/FlipperKitCrashReporterPlugin/FlipperKitCrashReporterPlugin.mm @@ -16,16 +16,8 @@ @property (assign, nonatomic) NSUInteger notificationID; @property (assign, nonatomic) NSUncaughtExceptionHandler *prevHandler; -- (void) handleException:(NSException *)exception; - @end -static void flipperkitUncaughtExceptionHandler(NSException *exception) { - NSLog(@"CRASH: %@", exception); - NSLog(@"Stack Trace: %@", [exception callStackSymbols]); - [[FlipperKitCrashReporterPlugin sharedInstance] handleException:exception]; -} - @implementation FlipperKitCrashReporterPlugin { std::unique_ptr _signalHandler; folly::ScopedEventBaseThread _crashReporterThread; @@ -55,30 +47,16 @@ static void flipperkitUncaughtExceptionHandler(NSException *exception) { return @"CrashReporter"; } -- (void) handleException:(NSException *)exception { - // TODO: Rather than having indirection from c function, somehow pass objective c selectors as a c function pointer to NSSetUncaughtExceptionHandler - self.notificationID += 1; - [self.connection send:@"crash-report" withParams:@{@"reason": [exception reason], @"name": [exception name], @"callstack": [exception callStackSymbols]}]; - if (self.prevHandler) { - self.prevHandler(exception); - } -} - - (void)sendCrashParams:(NSDictionary *)params { self.notificationID += 1; - [self.connection send:@"crash-report" withParams: params]; } - (void)didConnect:(id)connection { self.connection = connection; - _signalHandler = std::make_unique(self, _crashReporterThread.getEventBase()); - NSSetUncaughtExceptionHandler(&flipperkitUncaughtExceptionHandler); } - (void)didDisconnect { self.connection = nil; - _signalHandler.reset(nullptr); // deallocate the object - NSSetUncaughtExceptionHandler(self.prevHandler); } - (BOOL)runInBackground { diff --git a/src/plugins/crash_reporter/index.js b/src/plugins/crash_reporter/index.js index c7a0b7644..ba7a89bde 100644 --- a/src/plugins/crash_reporter/index.js +++ b/src/plugins/crash_reporter/index.js @@ -21,7 +21,7 @@ import type {Notification} from '../../plugin'; type Crash = {| notificationID: number, - callStack: [string], + callStack: string, reason: string, name: string, |}; @@ -112,18 +112,8 @@ export default class CrashReporterPlugin extends FlipperDevicePlugin { }); }; - convertCallstackToString(crash: Crash): string { - return crash.callStack.reduce((acc, val) => acc.concat('\n', val)); - } - - openInLogs = (crash: Crash) => { - this.props.selectPlugin( - 'DeviceLogs', - crash.callStack - .slice(0, 5) - .join('\n\tat ') - .trim(), - ); + openInLogs = (callstack: string) => { + this.props.selectPlugin('DeviceLogs', callstack); }; render() { @@ -134,7 +124,7 @@ export default class CrashReporterPlugin extends FlipperDevicePlugin { ]; if (crash) { - const callStackString = this.convertCallstackToString(crash); + const callStackString = crash.callStack; return ( @@ -163,7 +153,7 @@ export default class CrashReporterPlugin extends FlipperDevicePlugin { {this.device.os == 'Android' && ( -