// Copyright (c) 2017, 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. // VMOptions=--dwarf-stack-traces --save-debugging-info=$TEST_COMPILATION_DIR/dwarf_obfuscate.so --obfuscate import 'dart:io'; import 'package:expect/config.dart'; import 'package:native_stack_traces/native_stack_traces.dart'; import 'package:path/path.dart' as path; import 'dwarf_stack_trace_test.dart' as base; @pragma("vm:prefer-inline") bar() { // Keep the 'throw' and its argument on separate lines. throw // force linebreak with dart format "Hello, Dwarf!"; } @pragma("vm:never-inline") foo() { bar(); } Future main() async { String rawStack = ""; try { foo(); } catch (e, st) { rawStack = st.toString(); } if (!isVmAotConfiguration) { return; // Not running from an AOT compiled snapshot. } if (Platform.isAndroid) { return; // Generated dwarf.so not available on the test device. } if (Platform.script.toString().endsWith(".dll")) { return; // DWARF not available in DLLs. } final dwarf = Dwarf.fromFile( path.join( Platform.environment['TEST_COMPILATION_DIR']!, "dwarf_obfuscate.so", ), )!; await base.checkStackTrace(rawStack, dwarf, expectedCallsInfo); } final expectedCallsInfo = >[ // The first frame should correspond to the throw in bar, which was inlined // into foo (so we'll get information for two calls for that PC address). [ DartCallInfo( function: "bar", filename: "dwarf_stack_trace_obfuscate_test.dart", line: 18, column: 3, inlined: true, ), DartCallInfo( function: "foo", filename: "dwarf_stack_trace_obfuscate_test.dart", line: 24, column: 3, inlined: false, ), ], // The second frame corresponds to call to foo in main. [ DartCallInfo( function: "main", filename: "dwarf_stack_trace_obfuscate_test.dart", line: 30, column: 5, inlined: false, ), ], // Don't assume anything about any of the frames below the call to foo // in main, as this makes the test too brittle. ];