| Index: tests/standalone/dwarf_stack_trace_test.dart
|
| diff --git a/tests/standalone/dwarf_stack_trace_test.dart b/tests/standalone/dwarf_stack_trace_test.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..f5ec20b37b7b19fd19068aa40206023aa41d534d
|
| --- /dev/null
|
| +++ b/tests/standalone/dwarf_stack_trace_test.dart
|
| @@ -0,0 +1,107 @@
|
| +// 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
|
| +
|
| +import 'package:unittest/unittest.dart';
|
| +import 'dart:io';
|
| +
|
| +bar() {
|
| + // Keep the 'throw' and its argument on separate lines.
|
| + throw
|
| + "Hello, Dwarf!";
|
| +}
|
| +
|
| +foo() {
|
| + bar();
|
| +}
|
| +
|
| +main() {
|
| + String rawStack;
|
| + try {
|
| + foo();
|
| + } catch (e, st) {
|
| + rawStack = st.toString();
|
| + }
|
| + print(rawStack);
|
| +
|
| + if (Platform.isAndroid) {
|
| + // Attempts to execute 'file' etc fail with security exceptions on
|
| + // Android.
|
| + print("Skipping test on Android");
|
| + return;
|
| + }
|
| +
|
| + if (Platform.isMacOS) {
|
| + // addr2line is not part of the XCode command line tools.
|
| + print("Skipping test on MacOS");
|
| + return;
|
| + }
|
| +
|
| + if (Platform.isWindows) {
|
| + // Lacks 'file' and 'addr2line'.
|
| + print("Skipping test on Windows");
|
| + return;
|
| + }
|
| +
|
| + ProcessResult result = Process.runSync("file", ["--version"]);
|
| + if (result.exitCode != 0) {
|
| + print(result.stdout);
|
| + print(result.stderr);
|
| + throw "'file' is not present";
|
| + }
|
| +
|
| + result = Process.runSync("addr2line", ["--version"]);
|
| + if (result.exitCode != 0) {
|
| + print(result.stdout);
|
| + print(result.stderr);
|
| + throw "'addr2line' is not present";
|
| + }
|
| +
|
| + result = Process.runSync("file", [Platform.script.toFilePath()]);
|
| + if (result.exitCode != 0) {
|
| + print(result.stdout);
|
| + print(result.stderr);
|
| + throw "'file' failed";
|
| + return;
|
| + }
|
| + if (!result.stdout.contains("shared object")) {
|
| + print("Skipping test because we are not running from a dylib");
|
| + return;
|
| + }
|
| +
|
| + var frameRegex = new RegExp("pc ([0-9a-z]+) ([0-9a-zA-Z/\._]+)");
|
| + var symbolizedStack = new StringBuffer();
|
| + for (var frameMatch in frameRegex.allMatches(rawStack)) {
|
| + var framePC = frameMatch[1];
|
| + var frameDSO = frameMatch[2];
|
| + print(framePC);
|
| + print(frameDSO);
|
| + result = Process.runSync("addr2line",
|
| + ["--exe", frameDSO,
|
| + "--functions",
|
| + "--inlines",
|
| + framePC]);
|
| + if (result.exitCode != 0) {
|
| + print(result.stdout);
|
| + print(result.stderr);
|
| + throw "'addr2line' failed";
|
| + }
|
| + print(result.stdout);
|
| + symbolizedStack.write(result.stdout);
|
| + }
|
| +
|
| + print(symbolizedStack);
|
| + var symbolizedLines = symbolizedStack.toString().split("\n");
|
| + expect(symbolizedLines.length, greaterThan(8));
|
| + expect(symbolizedStack.toString(),
|
| + stringContainsInOrder(["bar",
|
| + "dwarf_stack_trace_test.dart:12",
|
| + "foo",
|
| + "dwarf_stack_trace_test.dart:17",
|
| + "main",
|
| + "dwarf_stack_trace_test.dart:23",
|
| + "main", // dispatcher
|
| + "dwarf_stack_trace_test.dart:20"]));
|
| +}
|
|
|