mirror of
https://github.com/dart-lang/sdk
synced 2024-09-19 23:41:50 +00:00
5be48e1aca
Change-Id: I5deb25204251ec23546f323ce8ac0dc50298dfd3 Reviewed-on: https://dart-review.googlesource.com/c/87484 Commit-Queue: Ryan Macnak <rmacnak@google.com> Reviewed-by: Alexander Markov <alexmarkov@google.com>
108 lines
2.7 KiB
Dart
108 lines
2.7 KiB
Dart
// 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 // force linebreak with dartfmt
|
|
"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:?"
|
|
]));
|
|
}
|