Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(266)

Unified Diff: tests/standalone/dwarf_stack_trace_test.dart

Issue 2762313003: Dwarf tools interpret line number table pc's as start boundries instead of end boundries. (Closed)
Patch Set: . Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/object.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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"]));
+}
« no previous file with comments | « runtime/vm/object.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698