Commit f18ced0f authored by Clemens Backes's avatar Clemens Backes Committed by Commit Bot

[wasm][debug] Add test for code garbage-collection

This adds a regression test for https://crrev.com/c/2652488. The test
reduces the available code space such that it would trigger an OOM
condition if code is not garbage-collected.
In order to guarantee garbage-collection in all configurations, an
explicit interrupt check is added to the WasmDebugBreak runtime
function.

R=thibaudm@chromium.org

Bug: chromium:1168564
Change-Id: I8fce7aa5128c9e3c9a7e2d2e7397c394fec7de85
Cq-Include-Trybots: luci.v8.try:v8_linux64_asan_rel_ng
Cq-Include-Trybots: luci.v8.try:v8_linux64_tsan_isolates_rel_ng
Cq-Include-Trybots: luci.v8.try:v8_linux64_tsan_rel_ng
Cq-Include-Trybots: luci.v8.try:v8_mac64_asan_rel_ng
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2652490
Commit-Queue: Clemens Backes <clemensb@chromium.org>
Reviewed-by: 's avatarThibaud Michaud <thibaudm@chromium.org>
Cr-Commit-Position: refs/heads/master@{#72435}
parent 074cfd61
......@@ -542,6 +542,11 @@ RUNTIME_FUNCTION(Runtime_WasmDebugBreak) {
int position = frame_finder.frame()->position();
isolate->set_context(instance->native_context());
// Stepping can repeatedly create code, and code GC requires stack guards to
// be executed on all involved isolates. Proactively do this here.
StackLimitCheck check(isolate);
if (check.InterruptRequested()) isolate->stack_guard()->HandleInterrupts();
// Enter the debugger.
DebugScope debug_scope(isolate->debug());
......
Tests repeated stepping through a large function (should not OOM)
Running test: test
Setting up global instance variable.
Got wasm script: wasm://wasm/8f70f0e2
Setting breakpoint
Paused 50 and running...
Paused 100 and running...
Paused 150 and running...
Paused 200 and running...
Paused 250 and running...
Paused 300 and running...
Paused 350 and running...
Paused 400 and running...
Paused 450 and running...
Paused 500 and running...
Paused 550 and running...
Paused 600 and running...
Paused 650 and running...
Paused 700 and running...
Paused 750 and running...
Paused 800 and running...
Paused 850 and running...
Paused 900 and running...
Paused 950 and running...
Paused 1000 and running...
test function returned.
Paused 1003 times.
// Copyright 2021 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Lower the maximum code space size to detect missed garbage collection
// earlier.
// Flags: --wasm-max-code-space=2
utils.load('test/inspector/wasm-inspector-test.js');
const {session, contextGroup, Protocol} = InspectorTest.start(
'Tests repeated stepping through a large function (should not OOM)');
session.setupScriptMap();
const builder = new WasmModuleBuilder();
const body = [kExprLocalGet, 0];
// Stepping through a long function will repeatedly recreate stepping code, with
// corresponding side tables. This should not run OOM
// (https://crbug.com/1168564).
// We use calls such that stack checks are executed reliably.
for (let i = 0; i < 500; ++i) body.push(...wasmI32Const(i), kExprI32Add);
const func_test =
builder.addFunction('test', kSig_i_i).addBody(body).exportFunc();
const module_bytes = builder.toArray();
let paused = 0;
Protocol.Debugger.onPaused(msg => {
++paused;
if (paused % 50 == 0) InspectorTest.log(`Paused ${paused} and running...`);
Protocol.Debugger.stepOver();
});
InspectorTest.runAsyncTestSuite([
async function test() {
await Protocol.Debugger.enable();
InspectorTest.log('Setting up global instance variable.');
WasmInspectorTest.instantiate(module_bytes);
const [, {params: wasmScript}] = await Protocol.Debugger.onceScriptParsed(2);
InspectorTest.log('Got wasm script: ' + wasmScript.url);
InspectorTest.log('Setting breakpoint');
await Protocol.Debugger.setBreakpoint({
location: {
scriptId: wasmScript.scriptId,
lineNumber: 0,
columnNumber: func_test.body_offset
}
});
await Protocol.Runtime.evaluate({ expression: 'instance.exports.test()' });
InspectorTest.log('test function returned.');
InspectorTest.log(`Paused ${paused} times.`);
}
]);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment