From 622b9c805f3d685069e47421bdf1eb76f1e4a29c Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Fri, 6 Sep 2019 13:47:44 -0700 Subject: [PATCH 1/3] Initial strawperson proposal for debugging modules --- debugging-modules/README.md | 264 +++++++++++++++++++++ debugging-modules/debugging-modules.png | Bin 0 -> 55308 bytes debugging-modules/debugging-modules.webidl | 224 +++++++++++++++++ 3 files changed, 488 insertions(+) create mode 100644 debugging-modules/README.md create mode 100644 debugging-modules/debugging-modules.png create mode 100644 debugging-modules/debugging-modules.webidl diff --git a/debugging-modules/README.md b/debugging-modules/README.md new file mode 100644 index 0000000..08c199d --- /dev/null +++ b/debugging-modules/README.md @@ -0,0 +1,264 @@ +# WebAssembly Debugging Modules + +This proposal defines interfaces for querying source-level debugging information +about a WebAssembly module. A WebAssembly runtime can leverage these interfaces +in its developer tools to translate from Wasm-level debugging information into a +user-friendly, source-level presentation. + +> **Note:** this is an incomplete, work-in-progress, strawperson proposal! +> Nothing here is set in stone and everything is likely to change! + +## Table of Contents + +- [Motivation](#motivation) +- [Overview](#overview) +- [Walkthrough](#walkthrough) +- [Interface Definitions](#interface-definitions) +- [FAQ](#faq) + +## Motivation + +Bugs abound, functions are slow, and developers need to figure out what's +happening and why. But developers aren't typically writing WebAssembly by hand, +they are writing in a high-level source language and compiling it down into +WebAssembly code. Even though the WebAssembly code is what is actually being +executed, developers prefer to debug and profile in terms of the source +language. This source-level experience is the norm for both native code in GDB, +LLDB, or `perf`, and for managed languages in their language-specific tooling, +like JavaScript in a Web browser's developer tools. This proposal aims unlock +the source-level debugging experience for Wasm code running inside a runtime. + +> **Note:** This proposal currently only defines APIs that are powerful enough +> to support source-level stepping in a debugger and symbolicating source-level +> locations and function names in other developer tools, such as a profiler or +> logging console. +> +> There are many possible debugging queries that this proposal does not +> currently define APIs for. It does not define APIs for inspecting scopes and +> recovering their bindings' values. It does not define APIs for expanding +> physical Wasm function frames into logical, possibly-inlined source function +> frames. We intend to support these use cases eventually, but are starting with +> just source-level location information, and can incrementally grow the +> debugging module API surface as time goes on. + +## Overview + +This proposal builds on the following existing or proposed WebAssembly concepts: + +* **Custom sections:** These are sections defined by the [core WebAssembly + spec's binary + format](https://webassembly.github.io/spec/core/binary/modules.html#custom-section) + whose contents are uninterpreted by the core spec but can be interpreted by + other tools or specifications (including this proposal) +* **Interface types:** The [WebAssembly interface + types](https://github.com/WebAssembly/interface-types/blob/master/proposals/interface-types/Explainer.md) + proposal allows defining shared-nothing, language-neutral interfaces. + +This proposal defines the following new concepts: + +* **Debuggee module:** A debuggee module is the Wasm module that is being + debugged or profiled. +* **Debugging module:** A debugging module is referenced from its debuggee Wasm + module, and is a separate Wasm module that translates between Wasm-level + debugging information and source-level debuggging information. A debugging + module is used by the engine's developer tools. +* **`WasmDebugger`:** The `WasmDebugger` interface provides raw, Wasm-level + debugging APIs for inspecting the debuggee Wasm module. It is implemented by + the Wasm engine and given to a debugging module's `SourceDebugger` interface. +* **`SourceDebugger`:** The `SourceDebugger` interface provides source-level + debugging APIs for inspecting the debuggee Wasm module. It is implemented by + the debugging module, translates between source-level information and + Wasm-level information, and wraps a `WasmDebugger` instance. +* **Wasm breakpoint:** A breakpoint associated with an instruction in the + debuggee module's code section. +* **Source breakpoint:** A breakpoint associated with a location in the source + text, and may map to multiple Wasm breakpoints. + +Collectively, these concepts and their relationships can be visualized together +in the following diagram: + +![](debugging-modules.png) + +## Walkthrough + +This section gives high-level walkthroughs of a few representative scenarios +where debugging modules are used by developer tools to provide source-level +information. + +### Symbolicating Profiler Stacks + +A sampling profiler will periodically pause Wasm execution, record its current +stack, and then resume execution. Each frame in a recorded stack contains the +Wasm module, function, and code offset. To display the profiler's results in a +source-level presentation, the developer tools would perform the following steps +for each frame of each stack: + +* Get or instantiate the debugger module `SourceDebugger` for the frame's Wasm + module. +* Let `sourceRanges` be the result of calling `SourceDebugger.getSourceRanges`. +* If `sourceRanges` is empty, leave the frame unsymbolicated. +* Otherwise, let the frame's source-level symbolication be the first entry of + `sourceRanges`. + +> **Note:** This algorithm and usage of `SourceDebugger.getSourceRanges` enables +> offline stack symbolication. It would not support symbolicating interpreted +> code stacks like C# stacks within Blazor. If we wanted to support +> symbolicating interpreted code stacks, it would likely require calling into +> the debuggee module or inspecting its state online during stack sampling. In +> turn, that would require only sampling at safe points of execution (similar to +> GC safe points) to avoid making intermediate states or optimizations +> observable. This can get a bit hairy, and whether we want to support this or +> not is an open question. + +### Listing Sources and Displaying Source Text + +Debugger GUIs often display a list of source files or a file and directory tree +of source files. To construct the complete list of source files for Wasm modules +in a runtime, perform the following steps: + +* For each debuggee module in the runtime: + * Get or create the debugging module `SourceDebugger` for the debuggee + module. + * Append the result of calling `SourceDebugger.listSources` to the source + list. + +When a user selects a source from the list of all source files, a debugger GUI +will typically display the selected source's text in a tab or panel. The text +for a source can be retrieved by calling `SourceDebugger.getSourceText`. + +### Setting a Breakpoint + +When a user asks the debugger to set a source-level breakpoint, the debugger +should perform the following steps: + +* Get the `SourceDebugger` associated with the breakpoint's source. +* Let `options` be the `SourceBreakpointOptions` describing the requested + breakpoint. +* Let `id` be the result of calling `SourceDebugger.setBreakpoint` with + `options`. + * If there is no expression at the breakpoint's location: + * The `SourceDebugger.setBreakpoint` implementation should return null. + * Otherwise: + * The `SourceDebugger` implementation should set as many Wasm + breakpoints as necessary to pause just before evaluation of the + breakpoint location's expression begins using + `WasmDebugger.setBreakpoint`. +* If `id` is null: + * Then no breakpoint was set (e.g because the requested location is within a + comment) and the UI should reflect this. +* Otherwise: + * Save the `id` for if/when the breakpoint gets hit or the user wants to + clear the breakpoint. + +### Hitting a Breakpoint + +* Let `dbg` be the `SourceDebugger` instance for the current frame. +* Construct the `WasmBreakInfo` for the Wasm breakpoint that was hit. +* Let `breakResult` be the result of calling `dbg.onBreak` with the + `WasmBreakInfo` +* If `breakResult.kind` is `"Continue"`: + * Resume the debuggee module's execution. +* Otherwise if `breakResult.kind` is `"Pause"`: + * Assert that `breakResult.location` is not null. + * Update the debugger UI to show that execution is paused at the source + location `breakResult.location`. + +### Stepping + +* Let `dbg` be the `SourceDebugger` instance for the current frame. +* Construct the `SourceStepOptions` for the step that the user requested. +* Call `dbg.onStep` with the `SourceStepOptions` + * The `onStep` implementation should use the `WasmDebugger` to set Wasm + breakpoint(s) where it determines execution should pause after taking the + requested step. +* Resume debuggee execution. + +Pausing after the step has been executed is equivalent to hitting a breakpoint, +as described above, although additionally `SourceDebugger` implementations +should delete any Wasm breakpoints that were created for the step with +`WasmDebugger.clearBreakpoint`. + +## Interface Definitions + +> **Note:** In order to be embedder agnostic — about whether it is a Web browser +> or JavaScript engine or not — we intend to eventually define these interfaces +> with [WebAssembly Interface +> Types](https://github.com/WebAssembly/interface-types/). However, since that +> standard is still coming together, we are temporarily describing the +> interfaces with Web IDL. + +The definitions for interfaces defined in this proposal are available in +[`debugging-modules.webidl`](./debugging-modules.webidl). + +## FAQ + +### Why not an existing debug info format like DWARF or PDB? + +There are a variety of reasons: + +* Future extensibility is harder with data formats than interfaces. With + interfaces, we can always add new, optional methods that debugging modules can + implement and use or not. With data formats, we need to design future + extensibility into the format, which requires more care and can also bloat its + encoded size with repetitive metadata and field tags. + +* Interpreting DWARF and PDB data is not straight forward, and the full + responsibility for that would lie completely on developer tools authors. In + contrast, debugging modules provide high-level methods for querying program + information, which are easier to work with for developer tools + authors. Toolchains can wrap DWARF or PDB interpreters in a debugging module + interface, and this debugging module implementation can be shared across any + toolchains that use that same format. Sharing debugging module implementations + is easier for toolchains than sharing DWARF/PDB interpretation logic is for + developer tools, since debugging modules talk to a `WasmDebugger` interface + and produce a well-known `SourceDebugger` interface that are used by all + toolchains, while developer tools would be calling into internal APIs that + aren't common across developer tools implementations. + +* Both debug info formats and standards ossify and evolve slowly. With debugging + modules, we allow interface implementations to experiment and iterate + separately from the standard. This allows innovations (for example more + compact data representations) to develop and ship without needing to go + through the slow standards process. + +* Static debug info formats don't provide a path forward for source-level + debugging of projects like Blazor, that run interpreted code inside their + Wasm. Debugging that interpreted code requires dynamic debugging APIs. + +### Why not a protocol? + +A wire protocol requires defining the same set of operations we want to support +that we define as interface methods in this proposal, and *also* a serialization +format. Defining a serialization format that is both compact and +future-extensible is no small task. Additionally, nothing about source-level +debugging *requires* over-the-wire communication or message passing, even if +that is often a good architectural decision. Implementations are free to proxy +this proposal's interface method calls across a protocol or to another +process. It doesn't make sense to bake a specific wire protocol into the +standard, when it can be left as an implementation detail. + +### Can debugging modules run outside of the debuggee process? + +Yes! Engines are free to run debugging modules in their own process and proxy +calls into `SourceDebugger`, or from `SourceDebugger` to `WasmDebugger`, across +an IPC channel (or even over a wire protocol). However, this is an +implementation detail for the Wasm engine and embedder, and not something that +this proposal needs to standardize. + +### What about Wasm that is ahead-of-time compiled into a native library or executable? + +This proposal does *not* intend to solve source-level debugging of a native +library or executable that is derived from Wasm that is in turn derived from +some high-level source language. That would most likely be best served by +providing the debugging information in the format that is usually expected for +native code on that platform (e.g. DWARF or PDB) so that all the usual tools for +debugging and profiling native code continue to Just Work without modification. + +Theoretically, this proposal could be leveraged in a Source->Wasm->Native +compilation pipeline for translating source-level information into Wasm-level +information, which the compiler then lowers into DWARF or PDB. Even though we +would not ultimately end up with a single debug format for all targets and all +situations, it is expected that a rising tide will lift all boats: some +debugging modules will undoubtedly use DWARF or PDB internally and having shared +tools and conventions for working with Wasm and those formats will help both the +AOT and runtime use cases. diff --git a/debugging-modules/debugging-modules.png b/debugging-modules/debugging-modules.png new file mode 100644 index 0000000000000000000000000000000000000000..f489a5410cf0354a5e9d37c461af7c571faf7b15 GIT binary patch literal 55308 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%0Da<;aq1SG0DQtWa%H?{v=23 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

0!gn getSourceRanges(WasmCodeOffset offset); + + /** + * Get the code offset(s) for the given source location, if any. + * + * Note that a source location may map to multiple code ranges, for example + * if one of a location's subexpressions has been hoisted out of a loop. + * + * Note that a source location might not map to any code range. A trivial + * example is a source location within a comment in the source text. Another + * example is an expression that was dead code eliminated. + */ + Sequence getWasmCodeRanges(SourceLocation location); + + /** + * Get a list of the source files that this Wasm module was compiled from. + */ + Sequence listSources(); + + /** + * Get the source text for the given source file. + */ + SourceText? getSourceText(SourceFilename source); +}; From 3f200c9e7e4f97a9ee1c19746ad4e1cf793e465e Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Wed, 2 Oct 2019 14:17:20 -0700 Subject: [PATCH 2/3] Mention embedder agnosticism in the motivation section --- debugging-modules/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/debugging-modules/README.md b/debugging-modules/README.md index 08c199d..75d0ecd 100644 --- a/debugging-modules/README.md +++ b/debugging-modules/README.md @@ -41,6 +41,10 @@ the source-level debugging experience for Wasm code running inside a runtime. > just source-level location information, and can incrementally grow the > debugging module API surface as time goes on. +Additionally, the same way that WebAssembly itself is embedder agnostic, and +doesn't require (for example) a Web browser or JavaScript engine, so too should +debugging functionality be embedder agnostic. + ## Overview This proposal builds on the following existing or proposed WebAssembly concepts: From 6d74a4223de92ac075b1988aa02a0f148afe754b Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Wed, 2 Oct 2019 14:18:23 -0700 Subject: [PATCH 3/3] Expand on "why not a protocol?" FAQ section --- debugging-modules/README.md | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/debugging-modules/README.md b/debugging-modules/README.md index 75d0ecd..9b09dd8 100644 --- a/debugging-modules/README.md +++ b/debugging-modules/README.md @@ -229,7 +229,7 @@ There are a variety of reasons: debugging of projects like Blazor, that run interpreted code inside their Wasm. Debugging that interpreted code requires dynamic debugging APIs. -### Why not a protocol? +### Why not a protocol instead of Wasm interface types? A wire protocol requires defining the same set of operations we want to support that we define as interface methods in this proposal, and *also* a serialization @@ -241,6 +241,21 @@ this proposal's interface method calls across a protocol or to another process. It doesn't make sense to bake a specific wire protocol into the standard, when it can be left as an implementation detail. +One might might be tempted to use a protocol to avoid an inter-standards +dependency on Wasm interface types. A protocol requires passing the serialized +data into and out of the debugging module. Passing that data in or out requires +knowledge of calling conventions and memory ownership (who mallocs and who +frees). This is a problem that Wasm interface types are already standardizing a +solution for, and which engines already intend to support. Duplicating standards +work done by another subgroup is far from ideal: it leads to more implementation +work for both toolchains and engines. + +The final thing to consider is the code size impact that using a protocol +implies. Incoming messages must be deserialized and outgoing messages must be +serialized, and both those things require non-trivial amounts of code. On the +other hand, with Wasm interface types most of the functionality is implemented +once in the Wasm engine, and doesn't bloat every module's code size. + ### Can debugging modules run outside of the debuggee process? Yes! Engines are free to run debugging modules in their own process and proxy