| [](https://pub.dev/packages/native_stack_traces) | |
| [](https://pub.dev/packages/native_stack_traces/publisher) | |
| 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. | |
| $ dart 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. | |
| $ dart compile exe -S throws.debug throws.dart | |
| # Run the program, saving the error output to throws.err. | |
| $ ./throws.exe 2>throws.err | |
| # Using the saved debugging information, we can translate the stack trace | |
| # contained in throws.err to its symbolic form. | |
| $ dart pub global run native_stack_traces:decode translate -d throws.debug -i throws.err | |
| ``` | |
| ## Features and bugs | |
| Please file feature requests and bugs at the [issue tracker][tracker]. | |
| [tracker]: https://github.com/dart-lang/sdk/issues |