| // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| /// Interact with developer tools such as the debugger and inspector. |
| /// |
| /// This is a specialized library intended for interacting with the Dart runtime |
| /// programmatically for debugging and inspection. Sample uses include advanced |
| /// debugging, and creating developer tools. |
| /// |
| /// This library has platform specific implementations for Dart web |
| /// and Dart Native (VM). A specific platform may not support all operations. |
| /// |
| /// The functionality provided by this library is generally only available |
| /// to Dart code run in development mode, e.g., `dart run`, and not in production |
| /// mode, e.g., the output of `dart compile exe`. |
| /// |
| /// ## Debugging |
| /// The [debugger] function can be used to stop the program as if a breakpoint |
| /// was hit. The breakpoint will be placed right after the call to `debugger`. |
| /// This functionality can be useful for triggering breakpoints based on logic |
| /// in the code. |
| /// |
| /// Example: |
| /// |
| /// ```dart template:main |
| /// var counter = 0; |
| /// final someInterestingValue = 1000; |
| /// while (true) { |
| /// if (counter == someInterestingValue) { |
| /// // Trigger a breakpoint in the debugger. |
| /// debugger(); |
| /// } |
| /// counter++; |
| /// } |
| /// ``` |
| /// |
| /// When executed with `dart run --observe`, and opened in DevTools, the |
| /// debugger will be stopped with `counter` at the value `1000`. |
| /// |
| /// ## Inspection |
| /// Developer tools, such as Dart DevTools, connected to the runtime system |
| /// may allow for inspecting execution timing in a "timeline" view. |
| /// The static methods of [Timeline] can add extra information and timing events |
| /// to this view. |
| /// |
| /// Example: |
| /// |
| /// ```dart |
| /// void main() { |
| /// Timeline.timeSync('Calculation loop', () { |
| /// for (var i = 30; i < 50; i++) { |
| /// Timeline.timeSync('fib($i)', () { |
| /// fibonacci(i); |
| /// }); |
| /// } |
| /// }); |
| /// } |
| /// |
| /// int fibonacci(int n) => (n < 2) ? n : fibonacci(n - 2) + fibonacci(n - 1); |
| /// ``` |
| /// |
| /// When executed with `dart run --observe`, and opened in DevTools, |
| /// the Performance tab will display a timeline containing the annotations |
| /// passed to `timeSync`. |
| /// |
| /// ## Developer tools |
| /// A developer tool, like the debugger built into the `dart` command, |
| /// may access information about the running application |
| /// exposed by the runtime system, |
| /// using the [Service] and [ServiceProtocolInfo] classes. |
| /// |
| /// {@category Core} |
| library dart.developer; |
| |
| import 'dart:_internal' show checkNotNullable, Since; |
| import 'dart:async'; |
| import 'dart:collection'; |
| import 'dart:convert'; |
| import 'dart:isolate' show Isolate, RawReceivePort, SendPort; |
| |
| part 'extension.dart'; |
| part 'http_profiling.dart'; |
| part 'profiler.dart'; |
| part 'service.dart'; |
| part 'timeline.dart'; |
| |
| /// If [when] is true, stop the program as if a breakpoint were hit at the |
| /// following statement. |
| /// |
| /// Returns the value of [when]. Some debuggers may display [message]. |
| /// |
| /// NOTE: When invoked, the isolate will not return until a debugger |
| /// continues execution. When running in the Dart VM, the behaviour is the same |
| /// regardless of whether or not a debugger is connected. When compiled to |
| /// JavaScript, this uses the "debugger" statement, and behaves exactly as |
| /// that does. |
| external bool debugger({bool when = true, String? message}); |
| |
| /// Send a reference to [object] to any attached debuggers. |
| /// |
| /// Debuggers may open an inspector on the object. Returns the argument. |
| external Object? inspect(Object? object); |
| |
| /// Emit a log event, which can can viewed using the DevTools |
| /// [Logging view](https://docs.flutter.dev/tools/devtools/logging). |
| /// |
| /// This function was designed to map closely to the logging information |
| /// collected by `package:logging`. |
| /// |
| /// - [message] is the log message |
| /// - [time] (optional) is the timestamp |
| /// - [sequenceNumber] (optional) is a monotonically increasing sequence number |
| /// - [level] (optional) is the severity level (a value between 0 and 2000); see |
| /// the `package:logging` `Level` class for an overview of the possible values |
| /// - [name] (optional) is the name of the source of the log message |
| /// - [zone] (optional) the zone where the log was emitted |
| /// - [error] (optional) an error object associated with this log event |
| /// - [stackTrace] (optional) a stack trace associated with this log event |
| external void log( |
| String message, { |
| DateTime? time, |
| int? sequenceNumber, |
| int level = 0, |
| String name = '', |
| Zone? zone, |
| Object? error, |
| StackTrace? stackTrace, |
| }); |
| |
| /// Current reachability barrier state. |
| /// |
| /// A reachability barrier state that provides a way to synchronize on |
| /// reachability. At value 'x', any object that became unreachable during |
| /// 'value' < 'x' has been collected and any associated finalizers have been |
| /// scheduled for execution, i.e. the non-execution of a finalizer reliably |
| /// indicates the object is still reachable in the previous barrier state. |
| /// |
| /// Objects that became unreachable in the current barrier state may have not |
| /// yet been collected or finalized. |
| /// |
| /// NOTE: There are no guarantees of forward progress. An implementation may |
| /// return the same value forever for this barrier state. |
| @Since('2.19') |
| external int get reachabilityBarrier; |
| |
| /// Functionality available on the native runtime. |
| @Since('3.0') |
| abstract final class NativeRuntime { |
| /// The build ID for the running application. |
| /// |
| /// The build ID of an application is a string containing a hexadecimal |
| /// representation of an arbitrarily sized sequence of bytes. This string |
| /// can be used to match a specific ahead-of-time compiled version of an |
| /// application, for example, to determine which debugging artifacts emitted |
| /// during compilation should be used to translate crash and error reports. |
| /// |
| /// The build ID is only available for ahead-of-time compiled programs. If a |
| /// build ID is not available, the value is `null`. |
| @Since('3.1') |
| external static String? get buildId; |
| |
| /// Writes a snapshot of the heap to [filepath]. |
| /// |
| /// The [filepath] should be a native file path that can be opened for writing. |
| /// Relative paths will be relative to the current working directory. If the |
| /// file already exists it will be overwritten. |
| /// |
| /// **WARNING**: Only works on a native runtime in certain configurations. An |
| /// [UnsupportedError] error is thrown if this functionality is not available |
| /// (e.g. in product mode, in non-standalone VM, ...) |
| /// |
| /// NOTE: This is an experimental function. We reserve the right to change |
| /// or remove it in the future. |
| external static void writeHeapSnapshotToFile(String filepath); |
| } |