Skip to main content

get_native_error 0.0.1 copy "get_native_error: ^0.0.1" to clipboard
get_native_error: ^0.0.1 copied to clipboard

Capture fatal native signals on Android and iOS and read them from Dart on the next launch.

get_native_error #

Flutter does not deliver fatal native signals (SIGSEGV, SIGABRT, and similar) to Dart. FlutterError.onError and PlatformDispatcher.instance.onError only see Dart exceptions. This plugin installs native handlers, writes a crash report to disk using async-signal-safe I/O, and hands that report to Dart on the next launch so your app can POST it to any API.

The isolate is not resumed. The process still dies. OOM and SIGKILL cannot be captured in-process.

Install #

dependencies:
  get_native_error: ^0.0.1

Call install() as early as main() allows, then consume a pending report before runApp:

import 'package:flutter/widgets.dart';
import 'package:get_native_error/get_native_error.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await NativeError.install();

  final crash = await NativeError.takePendingCrash();
  if (crash != null) {
    // POST crash.toJson() to your API.
  }

  runApp(const MyApp());
}

takePendingCrash() deletes the file so a report is sent once. Use peekPendingCrash() to inspect without deleting.

NativeCrashReport.kind is signal, java (Android uncaught JVM exceptions), or nsException (iOS uncaught NSException).

NativeError.crashNative() is debug only: it null-dereferences in C and kills the process. Do not call it in production.

What is captured #

Source Platforms
SIGSEGV, SIGABRT, SIGBUS, SIGFPE, SIGILL, SIGTRAP Android, iOS
Uncaught Java/Kotlin exceptions Android
Uncaught NSException iOS

Handlers use SA_SIGINFO | SA_ONSTACK and an alternate signal stack. Previous handlers (Flutter engine, Firebase Crashlytics, Sentry, and similar) are chained, then the default action is restored and the signal is re-raised so the OS still records a tombstone / crash report.

Do not install this plugin instead of those SDKs; install it so it can chain them. Call NativeError.install() after other crash reporters if you need this plugin to run first.

Example #

The example app shows a pending report after restart and a Crash natively button that null-dereferences in C (SIGSEGV). Tap it, relaunch, and the JSON payload should appear.

Limits #

  • Same-session catch or recovery is impossible.
  • Stack traces in the report are a best-effort frame-pointer walk. Readable symbols need ndk-stack (Android) or dSYMs (iOS).
  • Mach exception ports, MetricKit, minidumps, and breadcrumbs are out of scope for v1.
  • POSIX handlers can miss some iOS crashes that only go through Mach exceptions.

License #

MIT. See LICENSE.

2
likes
160
points
248
downloads

Documentation

API reference

Publisher

verified publisherjuan-campuzano.dev

Weekly Downloads

Capture fatal native signals on Android and iOS and read them from Dart on the next launch.

Repository (GitHub)
View/report issues

Topics

#crash-reporting #error-handling #android #ios

License

MIT (license)

Dependencies

flutter, plugin_platform_interface

More

Packages that depend on get_native_error

Packages that implement get_native_error