# native_stack_traces

This package provides libraries and a utility for decoding non-symbolic
stack traces generated by an AOT-compiled Dart application.

## Converting stack traces

In some modes of AOT compilation, information on mapping execution points to
source locations is no longer stored in the Dart image. Instead, this
information is translated to separately stored debugging information.
This debugging information can then be stripped from the application
before shipping.

However, there is a drawback. Stack traces generated by such an application no
longer includes file, function, and line number information (i.e., symbolic
stack traces). Instead, stack trace frames simply include program counter
information. Thus, to find the source information for these frames, we must use
the debugging information. This means either keeping the original unstripped
application, or saving the debugging information into a separate file.

Given this debugging information, the libraries in this package can turn
non-symbolic stack traces back into symbolic stack traces. In addition, this
package includes a command line tool `decode` whose output is the same as its
input except that non-symbolic stack traces are translated.

### Using `decode`

Take the following Dart code, which we put in `throws.dart`. The inlining
pragmas are here just to ensure that `bar` is inlined into `foo` and that `foo`
is _not_ inlined into `bar`, to illustrate how inlined code is handled in the
translated output.

```dart
@pragma('vm:prefer-inline')
bar() => throw null;

@pragma('vm:never-inline')
foo() => bar();

main() => foo();
```

Now we run the following commands:

```bash
# Make sure that we have the native_stack_traces package.
$ pub get native_stack_traces
$ pub global activate native_stack_traces

# We compile the example program, removing the source location information
# from the snapshot and saving the debugging information into throws.debug.
$ dart2native -k aot -S throws.debug -o throws.aotsnapshot throws.dart

# Run the program, saving the error output to throws.err.
$ dartaotruntime throws.aotsnapshot 2>throws.err

# Using the saved debugging information, we can translate the stack trace
# contained in throws.err to its symbolic form.
$ pub global run native_stack_traces:decode translate -d throws.debug -i throws.err

# We can also just pipe the output of running the program directly into
# the utility.
$ dartaotruntime throws.aotsnapshot |& \
    pub global run native_stack_traces:decode translate -d throws.debug
```

## Features and bugs

Please file feature requests and bugs at the [issue tracker][tracker].

[tracker]: https://github.com/dart-lang/sdk/issues
