A Dart package to help detect whenever your main event loop
is blocked. Running CPU intensive code
or any blocking code in your main Isolate
will lead to unresponsive GUIs.
event_loop_watchdog
will spawn a new Isolate
to monitor the main one. If the main Isolate is blocked for more than X milliseconds, then a stack trace is printed, which should indicate why it is blocked.
This is a debugging tool
, do not use it in production.
event_loop_watchdog
was designed to detect gross stalling, let's say > 100ms
. It was not written to help you find why frames are taking more than 16 ms
, although, it could still be useful for that, if you build in AOT
mode.
Features
- Prints a stack trace of your main Isolate whenever it's blocked for a long time.
- You can configure the timeout.
- You can provide your own action callback instead of using the default (which prints a stack trace).
Usage
The default usage requires a debug
build. See the AOT section for release
.
Simply create a WatchDog
instance and start it.
import 'package:event_loop_watchdog/event_loop_watchdog.dart';
void main() {
final wdog =
WatchDog(allowedEventLoopStallDuration: Duration(milliseconds: 100));
wdog.start();
$ dart --enable-vm-service example/main.dart
or
$ cd myapp && flutter run --debug # Or similar
For Flutter
, you probably want to skip startup
, as that usually blocks the main Isolate a bit:
Future.delayed(
Duration(seconds: 2),
() {
final wdog =
WatchDog(allowedEventLoopStallDuration: Duration(milliseconds: 100));
wdog.start();
},
);
Example output
Main event loop has been stalled for 199ms!
Stack trace:
fibonacci():main.dart:16
fibonacci():main.dart:18
fibonacci():main.dart:18
fibonacci():main.dart:18
fibonacci():main.dart:18
fibonacci():main.dart:18
fibonacci():main.dart:18
AOT
A debug build is needed since the VM service
is required to print the main isolate stack trace.
You can however provide your own callback action which can do other things and does not require VM service. See the example.
I suggest you write a C library that prints a native stacktrace, and call that from your custom Action
, via FFI. This way you
can still get a stacktrace in release mode, which is better for profiling things.
Additional information
event_loop_watchdog
is supported and maintained by Klarälvdalens Datakonsult AB (KDAB).
Please visit www.kdab.com to meet the people who write code like this.
Stay up-to-date with KDAB product announcements: