03301c9bfb
The resulting DLL lacks debugging information / PDB. TEST=ci Bug: https://github.com/dart-lang/sdk/issues/60812 Bug: https://github.com/dart-lang/sdk/issues/60813 Cq-Include-Trybots: luci.dart.try:vm-aot-win-debug-arm64-try,vm-aot-win-debug-x64-try,vm-aot-win-release-arm64-try,vm-aot-win-release-x64-try Change-Id: I305bad0081ec24f27249ad9b75ff8d32fa9c4893 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/428200 Reviewed-by: Tess Strickland <sstrickl@google.com> Commit-Queue: Ryan Macnak <rmacnak@google.com>
140 lines
3.3 KiB
Dart
140 lines
3.3 KiB
Dart
// Copyright (c) 2021, 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_invisible_functions.so
|
|
|
|
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 dwarf_stack_trace_test;
|
|
|
|
const int LINE_A = 24;
|
|
const int LINE_B = 30;
|
|
const int LINE_C = 37;
|
|
const int LINE_D = 45;
|
|
const int LINE_E = 57;
|
|
|
|
@pragma("vm:prefer-inline")
|
|
bar() {
|
|
// Keep the 'throw' and its argument on separate lines.
|
|
throw // force linebreak with dart format // LINE_A
|
|
"Hello, Dwarf!";
|
|
}
|
|
|
|
@pragma("vm:never-inline")
|
|
foo() {
|
|
bar(); // LINE_B
|
|
}
|
|
|
|
@pragma("vm:never-inline")
|
|
bazz(void Function() func) {
|
|
// Call through tear-off (implicit closure function) which should be
|
|
// omitted from the stack trace.
|
|
func(); // LINE_C
|
|
}
|
|
|
|
class A<T> {
|
|
A();
|
|
|
|
@pragma("vm:never-inline")
|
|
void add(T x) {
|
|
bazz(foo); // LINE_D
|
|
}
|
|
}
|
|
|
|
dynamic aa = int.parse('1') == 1 ? A() : [];
|
|
|
|
Future<void> main() async {
|
|
String rawStack = "";
|
|
try {
|
|
// Dynamic call to a generic-covariant method goes through the
|
|
// dynamic invocation forwarder function, which should be
|
|
// omitted from the stack trace.
|
|
aa.add(42); // LINE_E
|
|
} 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_invisible_functions.so",
|
|
),
|
|
)!;
|
|
|
|
await dwarf_stack_trace_test.checkStackTrace(
|
|
rawStack,
|
|
dwarf,
|
|
expectedCallsInfo,
|
|
);
|
|
}
|
|
|
|
final expectedCallsInfo = <List<DartCallInfo>>[
|
|
// Frame 1: 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_invisible_functions_test.dart",
|
|
line: LINE_A,
|
|
column: 3,
|
|
inlined: true,
|
|
),
|
|
DartCallInfo(
|
|
function: "foo",
|
|
filename: "dwarf_stack_trace_invisible_functions_test.dart",
|
|
line: LINE_B,
|
|
column: 3,
|
|
inlined: false,
|
|
),
|
|
],
|
|
// Frame 2: call to foo in bazz.
|
|
[
|
|
DartCallInfo(
|
|
function: "bazz",
|
|
filename: "dwarf_stack_trace_invisible_functions_test.dart",
|
|
line: LINE_C,
|
|
column: 3,
|
|
inlined: false,
|
|
),
|
|
],
|
|
// Frame 3: call to bazz in A.method.
|
|
[
|
|
DartCallInfo(
|
|
function: "A.add",
|
|
filename: "dwarf_stack_trace_invisible_functions_test.dart",
|
|
line: LINE_D,
|
|
column: 5,
|
|
inlined: false,
|
|
),
|
|
],
|
|
// Frame 4: the call to foo in main.
|
|
[
|
|
DartCallInfo(
|
|
function: "main",
|
|
filename: "dwarf_stack_trace_invisible_functions_test.dart",
|
|
line: LINE_E,
|
|
column: 8,
|
|
inlined: false,
|
|
),
|
|
],
|
|
// Don't assume anything about any of the frames below the main,
|
|
// as this makes the test too brittle.
|
|
];
|