
- VS Code extension: - Add module symbol table viewer using [Tabulator](https://tabulator.info/) for sorting and formatting rows. - Add context menu action to the modules tree. - lldb-dap - Add `DAPGetModuleSymbolsRequest` to get symbols from a module. Fixes #140626 [Screencast From 2025-08-15 19-12-33.webm](https://github.com/user-attachments/assets/75e2f229-ac82-487c-812e-3ea33a575b70)
1011 lines
39 KiB
C++
1011 lines
39 KiB
C++
//===-- ProtocolTypes.h ---------------------------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file contains POD structs based on the DAP specification at
|
|
// https://microsoft.github.io/debug-adapter-protocol/specification
|
|
//
|
|
// This is not meant to be a complete implementation, new interfaces are added
|
|
// when they're needed.
|
|
//
|
|
// Each struct has a toJSON and fromJSON function, that converts between
|
|
// the struct and a JSON representation. (See JSON.h)
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLDB_TOOLS_LLDB_DAP_PROTOCOL_PROTOCOL_REQUESTS_H
|
|
#define LLDB_TOOLS_LLDB_DAP_PROTOCOL_PROTOCOL_REQUESTS_H
|
|
|
|
#include "Protocol/ProtocolBase.h"
|
|
#include "Protocol/ProtocolTypes.h"
|
|
#include "lldb/lldb-defines.h"
|
|
#include "lldb/lldb-types.h"
|
|
#include "llvm/ADT/DenseSet.h"
|
|
#include "llvm/ADT/StringMap.h"
|
|
#include "llvm/Support/JSON.h"
|
|
#include <chrono>
|
|
#include <cstdint>
|
|
#include <optional>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
namespace lldb_dap::protocol {
|
|
|
|
/// Arguments for `cancel` request.
|
|
struct CancelArguments {
|
|
/// The ID (attribute `seq`) of the request to cancel. If missing no request
|
|
/// is cancelled.
|
|
///
|
|
/// Both a `requestId` and a `progressId` can be specified in one request.
|
|
std::optional<int64_t> requestId;
|
|
|
|
/// The ID (attribute `progressId`) of the progress to cancel. If missing no
|
|
/// progress is cancelled.
|
|
///
|
|
/// Both a `requestId` and a `progressId` can be specified in one request.
|
|
std::optional<int64_t> progressId;
|
|
};
|
|
bool fromJSON(const llvm::json::Value &, CancelArguments &, llvm::json::Path);
|
|
|
|
/// Response to `cancel` request. This is just an acknowledgement, so no body
|
|
/// field is required.
|
|
using CancelResponse = VoidResponse;
|
|
|
|
/// Arguments for `disconnect` request.
|
|
struct DisconnectArguments {
|
|
/// A value of true indicates that this `disconnect` request is part of a
|
|
/// restart sequence.
|
|
std::optional<bool> restart;
|
|
|
|
/// Indicates whether the debuggee should be terminated when the debugger is
|
|
/// disconnected. If unspecified, the debug adapter is free to do whatever it
|
|
/// thinks is best. The attribute is only honored by a debug adapter if the
|
|
/// corresponding capability `supportTerminateDebuggee` is true.
|
|
std::optional<bool> terminateDebuggee;
|
|
|
|
/// Indicates whether the debuggee should stay suspended when the debugger is
|
|
/// disconnected. If unspecified, the debuggee should resume execution. The
|
|
/// attribute is only honored by a debug adapter if the corresponding
|
|
/// capability `supportSuspendDebuggee` is true.
|
|
std::optional<bool> suspendDebuggee;
|
|
};
|
|
bool fromJSON(const llvm::json::Value &, DisconnectArguments &,
|
|
llvm::json::Path);
|
|
|
|
/// Response to `disconnect` request. This is just an acknowledgement, so no
|
|
/// body field is required.
|
|
using DisconnectResponse = VoidResponse;
|
|
|
|
/// Features supported by DAP clients.
|
|
enum ClientFeature : unsigned {
|
|
eClientFeatureVariableType,
|
|
eClientFeatureVariablePaging,
|
|
eClientFeatureRunInTerminalRequest,
|
|
eClientFeatureMemoryReferences,
|
|
eClientFeatureProgressReporting,
|
|
eClientFeatureInvalidatedEvent,
|
|
eClientFeatureMemoryEvent,
|
|
/// Client supports the `argsCanBeInterpretedByShell` attribute on the
|
|
/// `runInTerminal` request.
|
|
eClientFeatureArgsCanBeInterpretedByShell,
|
|
eClientFeatureStartDebuggingRequest,
|
|
/// The client will interpret ANSI escape sequences in the display of
|
|
/// `OutputEvent.output` and `Variable.value` fields when
|
|
/// `Capabilities.supportsANSIStyling` is also enabled.
|
|
eClientFeatureANSIStyling,
|
|
};
|
|
|
|
/// Format of paths reported by the debug adapter.
|
|
enum PathFormat : unsigned { ePatFormatPath, ePathFormatURI };
|
|
|
|
/// Arguments for `initialize` request.
|
|
struct InitializeRequestArguments {
|
|
/// The ID of the debug adapter.
|
|
std::string adapterID;
|
|
|
|
/// The ID of the client using this adapter.
|
|
std::optional<std::string> clientID;
|
|
|
|
/// The human-readable name of the client using this adapter.
|
|
std::optional<std::string> clientName;
|
|
|
|
/// The ISO-639 locale of the client using this adapter, e.g. en-US or de-CH.
|
|
std::optional<std::string> locale;
|
|
|
|
/// Determines in what format paths are specified. The default is `path`,
|
|
/// which is the native format.
|
|
PathFormat pathFormat = ePatFormatPath;
|
|
|
|
/// If true all line numbers are 1-based (default).
|
|
std::optional<bool> linesStartAt1;
|
|
|
|
/// If true all column numbers are 1-based (default).
|
|
std::optional<bool> columnsStartAt1;
|
|
|
|
/// The set of supported features reported by the client.
|
|
llvm::DenseSet<ClientFeature> supportedFeatures;
|
|
|
|
/// lldb-dap Extensions
|
|
/// @{
|
|
|
|
/// Source init files when initializing lldb::SBDebugger.
|
|
std::optional<bool> lldbExtSourceInitFile;
|
|
|
|
/// @}
|
|
};
|
|
bool fromJSON(const llvm::json::Value &, InitializeRequestArguments &,
|
|
llvm::json::Path);
|
|
|
|
/// Response to `initialize` request. The capabilities of this debug adapter.
|
|
using InitializeResponse = std::optional<Capabilities>;
|
|
|
|
/// DAP Launch and Attach common configurations.
|
|
///
|
|
/// See package.json debuggers > configurationAttributes > launch or attach >
|
|
/// properties for common configurations.
|
|
struct Configuration {
|
|
/// Specify a working directory to use when launching `lldb-dap`. If the debug
|
|
/// information in your executable contains relative paths, this option can be
|
|
/// used so that `lldb-dap` can find source files and object files that have
|
|
/// relative paths.
|
|
std::string debuggerRoot;
|
|
|
|
/// Enable auto generated summaries for variables when no summaries exist for
|
|
/// a given type. This feature can cause performance delays in large projects
|
|
/// when viewing variables.
|
|
bool enableAutoVariableSummaries = false;
|
|
|
|
/// If a variable is displayed using a synthetic children, also display the
|
|
/// actual contents of the variable at the end under a [raw] entry. This is
|
|
/// useful when creating synthetic child plug-ins as it lets you see the
|
|
/// actual contents of the variable.
|
|
bool enableSyntheticChildDebugging = false;
|
|
|
|
/// Enable language specific extended backtraces.
|
|
bool displayExtendedBacktrace = false;
|
|
|
|
/// Stop at the entry point of the program when launching or attaching.
|
|
bool stopOnEntry = false;
|
|
|
|
/// Optional timeout when waiting for the program to `runInTerminal` or
|
|
/// attach.
|
|
std::chrono::seconds timeout = std::chrono::seconds(30);
|
|
|
|
/// The escape prefix to use for executing regular LLDB commands in the Debug
|
|
/// Console, instead of printing variables. Defaults to a backtick. If it's an
|
|
/// empty string, then all expression in the Debug Console are treated as
|
|
/// regular LLDB commands.
|
|
std::string commandEscapePrefix = "`";
|
|
|
|
/// If non-empty, stack frames will have descriptions generated based on the
|
|
/// provided format. See https://lldb.llvm.org/use/formatting.html for an
|
|
/// explanation on format strings for frames. If the format string contains
|
|
/// errors, an error message will be displayed on the Debug Console and the
|
|
/// default frame names will be used. This might come with a performance cost
|
|
/// because debug information might need to be processed to generate the
|
|
/// description.
|
|
std::optional<std::string> customFrameFormat;
|
|
|
|
/// Same as `customFrameFormat`, but for threads instead of stack frames.
|
|
std::optional<std::string> customThreadFormat;
|
|
|
|
/// Specify a source path to remap "./" to allow full paths to be used when
|
|
/// setting breakpoints in binaries that have relative source paths.
|
|
std::string sourcePath;
|
|
|
|
/// Specify an array of path re-mappings. Each element in the array must be a
|
|
/// two element array containing a source and destination pathname. Overrides
|
|
/// sourcePath.
|
|
std::vector<std::pair<std::string, std::string>> sourceMap;
|
|
|
|
/// LLDB commands executed upon debugger startup prior to creating the LLDB
|
|
/// target.
|
|
std::vector<std::string> preInitCommands;
|
|
|
|
/// LLDB commands executed upon debugger startup prior to creating the LLDB
|
|
/// target.
|
|
std::vector<std::string> initCommands;
|
|
|
|
/// LLDB commands executed just before launching/attaching, after the LLDB
|
|
/// target has been created.
|
|
std::vector<std::string> preRunCommands;
|
|
|
|
/// LLDB commands executed just after launching/attaching, after the LLDB
|
|
/// target has been created.
|
|
std::vector<std::string> postRunCommands;
|
|
|
|
/// LLDB commands executed just after each stop.
|
|
std::vector<std::string> stopCommands;
|
|
|
|
/// LLDB commands executed when the program exits.
|
|
std::vector<std::string> exitCommands;
|
|
|
|
/// LLDB commands executed when the debugging session ends.
|
|
std::vector<std::string> terminateCommands;
|
|
|
|
/// Path to the executable.
|
|
///
|
|
/// *NOTE:* When launching, either `launchCommands` or `program` must be
|
|
/// configured. If both are configured then `launchCommands` takes priority.
|
|
std::string program;
|
|
|
|
/// Target triple for the program (arch-vendor-os). If not set, inferred from
|
|
/// the binary.
|
|
std::string targetTriple;
|
|
|
|
/// Specify name of the platform to use for this target, creating the platform
|
|
/// if necessary.
|
|
std::string platformName;
|
|
};
|
|
|
|
enum Console : unsigned {
|
|
eConsoleInternal,
|
|
eConsoleIntegratedTerminal,
|
|
eConsoleExternalTerminal
|
|
};
|
|
|
|
/// lldb-dap specific launch arguments.
|
|
struct LaunchRequestArguments {
|
|
/// Common lldb-dap configuration values for launching/attaching operations.
|
|
Configuration configuration;
|
|
|
|
/// If true, the launch request should launch the program without enabling
|
|
/// debugging.
|
|
bool noDebug = false;
|
|
|
|
/// Launch specific operations.
|
|
///
|
|
/// See package.json debuggers > configurationAttributes > launch >
|
|
/// properties.
|
|
/// @{
|
|
|
|
/// LLDB commands executed to launch the program.
|
|
///
|
|
/// *NOTE:* Either launchCommands or program must be configured.
|
|
///
|
|
/// If set, takes priority over the 'program' when launching the target.
|
|
std::vector<std::string> launchCommands;
|
|
|
|
/// The program working directory.
|
|
std::string cwd;
|
|
|
|
/// An array of command line argument strings to be passed to the program
|
|
/// being launched.
|
|
std::vector<std::string> args;
|
|
|
|
/// Environment variables to set when launching the program. The format of
|
|
/// each environment variable string is "VAR=VALUE" for environment variables
|
|
/// with values or just "VAR" for environment variables with no values.
|
|
llvm::StringMap<std::string> env;
|
|
|
|
/// If set, then the client stub should detach rather than killing the
|
|
/// debuggee if it loses connection with lldb.
|
|
bool detachOnError = false;
|
|
|
|
/// Disable ASLR (Address Space Layout Randomization) when launching the
|
|
/// process.
|
|
bool disableASLR = true;
|
|
|
|
/// Do not set up for terminal I/O to go to running process.
|
|
bool disableSTDIO = false;
|
|
|
|
/// Set whether to shell expand arguments to the process when launching.
|
|
bool shellExpandArguments = false;
|
|
|
|
/// Specify where to launch the program: internal console, integrated
|
|
/// terminal or external terminal.
|
|
Console console = eConsoleInternal;
|
|
|
|
/// @}
|
|
};
|
|
bool fromJSON(const llvm::json::Value &, LaunchRequestArguments &,
|
|
llvm::json::Path);
|
|
|
|
/// Response to `launch` request. This is just an acknowledgement, so no body
|
|
/// field is required.
|
|
using LaunchResponse = VoidResponse;
|
|
|
|
#define LLDB_DAP_INVALID_PORT -1
|
|
|
|
/// lldb-dap specific attach arguments.
|
|
struct AttachRequestArguments {
|
|
/// Common lldb-dap configuration values for launching/attaching operations.
|
|
Configuration configuration;
|
|
|
|
/// Attach specific operations.
|
|
///
|
|
/// See package.json debuggers > configurationAttributes > attach >
|
|
/// properties.
|
|
/// @{
|
|
|
|
/// Custom commands that are executed instead of attaching to a process ID or
|
|
/// to a process by name. These commands may optionally create a new target
|
|
/// and must perform an attach. A valid process must exist after these
|
|
/// commands complete or the `"attach"` will fail.
|
|
std::vector<std::string> attachCommands;
|
|
|
|
/// System process ID to attach to.
|
|
lldb::pid_t pid = LLDB_INVALID_PROCESS_ID;
|
|
|
|
/// Wait for the process to launch.
|
|
bool waitFor = false;
|
|
|
|
/// TCP/IP port to attach to a remote system. Specifying both pid and port is
|
|
/// an error.
|
|
int32_t gdbRemotePort = LLDB_DAP_INVALID_PORT;
|
|
|
|
/// The hostname to connect to a remote system. The default hostname being
|
|
/// used `localhost`.
|
|
std::string gdbRemoteHostname = "localhost";
|
|
|
|
/// Path to the core file to debug.
|
|
std::string coreFile;
|
|
|
|
/// @}
|
|
};
|
|
bool fromJSON(const llvm::json::Value &, AttachRequestArguments &,
|
|
llvm::json::Path);
|
|
|
|
/// Response to `attach` request. This is just an acknowledgement, so no body
|
|
/// field is required.
|
|
using AttachResponse = VoidResponse;
|
|
|
|
/// Arguments for `continue` request.
|
|
struct ContinueArguments {
|
|
/// Specifies the active thread. If the debug adapter supports single thread
|
|
/// execution (see `supportsSingleThreadExecutionRequests`) and the argument
|
|
/// `singleThread` is true, only the thread with this ID is resumed.
|
|
lldb::tid_t threadId = LLDB_INVALID_THREAD_ID;
|
|
|
|
/// If this flag is true, execution is resumed only for the thread with given
|
|
/// `threadId`.
|
|
bool singleThread = false;
|
|
};
|
|
bool fromJSON(const llvm::json::Value &, ContinueArguments &, llvm::json::Path);
|
|
|
|
/// Response to `continue` request.
|
|
struct ContinueResponseBody {
|
|
// If omitted or set to `true`, this response signals to the client that all
|
|
// threads have been resumed. The value `false` indicates that not all threads
|
|
// were resumed.
|
|
bool allThreadsContinued = true;
|
|
};
|
|
llvm::json::Value toJSON(const ContinueResponseBody &);
|
|
|
|
/// Arguments for `configurationDone` request.
|
|
using ConfigurationDoneArguments = EmptyArguments;
|
|
|
|
/// Response to `configurationDone` request. This is just an acknowledgement, so
|
|
/// no body field is required.
|
|
using ConfigurationDoneResponse = VoidResponse;
|
|
|
|
/// Arguments for `setVariable` request.
|
|
struct SetVariableArguments {
|
|
/// The reference of the variable container. The `variablesReference` must
|
|
/// have been obtained in the current suspended state. See 'Lifetime of Object
|
|
/// References' in the Overview section for details.
|
|
uint64_t variablesReference = UINT64_MAX;
|
|
|
|
/// The name of the variable in the container.
|
|
std::string name;
|
|
|
|
/// The value of the variable.
|
|
std::string value;
|
|
|
|
/// Specifies details on how to format the response value.
|
|
ValueFormat format;
|
|
};
|
|
bool fromJSON(const llvm::json::Value &, SetVariableArguments &,
|
|
llvm::json::Path);
|
|
|
|
/// Response to `setVariable` request.
|
|
struct SetVariableResponseBody {
|
|
/// The new value of the variable.
|
|
std::string value;
|
|
|
|
/// The type of the new value. Typically shown in the UI when hovering over
|
|
/// the value.
|
|
std::string type;
|
|
|
|
/// If `variablesReference` is > 0, the new value is structured and its
|
|
/// children can be retrieved by passing `variablesReference` to the
|
|
/// `variables` request as long as execution remains suspended. See 'Lifetime
|
|
/// of Object References' in the Overview section for details.
|
|
///
|
|
/// If this property is included in the response, any `variablesReference`
|
|
/// previously associated with the updated variable, and those of its
|
|
/// children, are no longer valid.
|
|
uint64_t variablesReference = 0;
|
|
|
|
/// The number of named child variables.
|
|
/// The client can use this information to present the variables in a paged
|
|
/// UI and fetch them in chunks.
|
|
/// The value should be less than or equal to 2147483647 (2^31-1).
|
|
uint32_t namedVariables = 0;
|
|
|
|
/// The number of indexed child variables.
|
|
/// The client can use this information to present the variables in a paged
|
|
/// UI and fetch them in chunks.
|
|
/// The value should be less than or equal to 2147483647 (2^31-1).
|
|
uint32_t indexedVariables = 0;
|
|
|
|
/// A memory reference to a location appropriate for this result.
|
|
/// For pointer type eval results, this is generally a reference to the
|
|
/// memory address contained in the pointer.
|
|
/// This attribute may be returned by a debug adapter if corresponding
|
|
/// capability `supportsMemoryReferences` is true.
|
|
lldb::addr_t memoryReference = LLDB_INVALID_ADDRESS;
|
|
|
|
/// A reference that allows the client to request the location where the new
|
|
/// value is declared. For example, if the new value is function pointer, the
|
|
/// adapter may be able to look up the function's location. This should be
|
|
/// present only if the adapter is likely to be able to resolve the location.
|
|
///
|
|
/// This reference shares the same lifetime as the `variablesReference`. See
|
|
/// 'Lifetime of Object References' in the Overview section for details.
|
|
uint64_t valueLocationReference = 0;
|
|
};
|
|
llvm::json::Value toJSON(const SetVariableResponseBody &);
|
|
|
|
struct ScopesArguments {
|
|
/// Retrieve the scopes for the stack frame identified by `frameId`. The
|
|
/// `frameId` must have been obtained in the current suspended state. See
|
|
/// 'Lifetime of Object References' in the Overview section for details.
|
|
uint64_t frameId = LLDB_INVALID_FRAME_ID;
|
|
};
|
|
bool fromJSON(const llvm::json::Value &, ScopesArguments &, llvm::json::Path);
|
|
|
|
struct ScopesResponseBody {
|
|
std::vector<Scope> scopes;
|
|
};
|
|
llvm::json::Value toJSON(const ScopesResponseBody &);
|
|
|
|
/// Arguments for `source` request.
|
|
struct SourceArguments {
|
|
/// Specifies the source content to load. Either `source.path` or
|
|
/// `source.sourceReference` must be specified.
|
|
std::optional<Source> source;
|
|
|
|
/// The reference to the source. This is the same as `source.sourceReference`.
|
|
/// This is provided for backward compatibility since old clients do not
|
|
/// understand the `source` attribute.
|
|
int64_t sourceReference = LLDB_DAP_INVALID_SRC_REF;
|
|
};
|
|
bool fromJSON(const llvm::json::Value &, SourceArguments &, llvm::json::Path);
|
|
|
|
/// Response to `source` request.
|
|
struct SourceResponseBody {
|
|
/// Content of the source reference.
|
|
std::string content;
|
|
|
|
/// Content type (MIME type) of the source.
|
|
std::optional<std::string> mimeType;
|
|
};
|
|
llvm::json::Value toJSON(const SourceResponseBody &);
|
|
|
|
/// Arguments for the `threads` request, no arguments.
|
|
using ThreadsArguments = EmptyArguments;
|
|
|
|
/// Response to `threads` request.
|
|
struct ThreadsResponseBody {
|
|
/// All threads.
|
|
std::vector<Thread> threads;
|
|
};
|
|
llvm::json::Value toJSON(const ThreadsResponseBody &);
|
|
|
|
/// Arguments for `next` request.
|
|
struct NextArguments {
|
|
/// Specifies the thread for which to resume execution for one step (of the
|
|
/// given granularity).
|
|
lldb::tid_t threadId = LLDB_INVALID_THREAD_ID;
|
|
|
|
/// If this flag is true, all other suspended threads are not resumed.
|
|
bool singleThread = false;
|
|
|
|
/// Stepping granularity. If no granularity is specified, a granularity of
|
|
/// `statement` is assumed.
|
|
SteppingGranularity granularity = eSteppingGranularityStatement;
|
|
};
|
|
bool fromJSON(const llvm::json::Value &, NextArguments &, llvm::json::Path);
|
|
|
|
/// Response to `next` request. This is just an acknowledgement, so no
|
|
/// body field is required.
|
|
using NextResponse = VoidResponse;
|
|
|
|
/// Arguments for `stepIn` request.
|
|
struct StepInArguments {
|
|
/// Specifies the thread for which to resume execution for one step-into (of
|
|
/// the given granularity).
|
|
lldb::tid_t threadId = LLDB_INVALID_THREAD_ID;
|
|
|
|
/// If this flag is true, all other suspended threads are not resumed.
|
|
bool singleThread = false;
|
|
|
|
/// Id of the target to step into.
|
|
std::optional<uint64_t> targetId;
|
|
|
|
/// Stepping granularity. If no granularity is specified, a granularity of
|
|
/// `statement` is assumed.
|
|
SteppingGranularity granularity = eSteppingGranularityStatement;
|
|
};
|
|
bool fromJSON(const llvm::json::Value &, StepInArguments &, llvm::json::Path);
|
|
|
|
/// Response to `stepIn` request. This is just an acknowledgement, so no
|
|
/// body field is required.
|
|
using StepInResponse = VoidResponse;
|
|
|
|
/// Arguments for `stepInTargets` request.
|
|
struct StepInTargetsArguments {
|
|
/// The stack frame for which to retrieve the possible step-in targets.
|
|
uint64_t frameId = LLDB_INVALID_FRAME_ID;
|
|
};
|
|
bool fromJSON(const llvm::json::Value &, StepInTargetsArguments &,
|
|
llvm::json::Path);
|
|
|
|
/// Response to `stepInTargets` request.
|
|
struct StepInTargetsResponseBody {
|
|
/// The possible step-in targets of the specified source location.
|
|
std::vector<StepInTarget> targets;
|
|
};
|
|
llvm::json::Value toJSON(const StepInTargetsResponseBody &);
|
|
|
|
/// Arguments for `stepOut` request.
|
|
struct StepOutArguments {
|
|
/// Specifies the thread for which to resume execution for one step-out (of
|
|
/// the given granularity).
|
|
lldb::tid_t threadId = LLDB_INVALID_THREAD_ID;
|
|
|
|
/// If this flag is true, all other suspended threads are not resumed.
|
|
std::optional<bool> singleThread;
|
|
|
|
/// Stepping granularity. If no granularity is specified, a granularity of
|
|
/// `statement` is assumed.
|
|
SteppingGranularity granularity = eSteppingGranularityStatement;
|
|
};
|
|
bool fromJSON(const llvm::json::Value &, StepOutArguments &, llvm::json::Path);
|
|
|
|
/// Response to `stepOut` request. This is just an acknowledgement, so no
|
|
/// body field is required.
|
|
using StepOutResponse = VoidResponse;
|
|
|
|
/// Arguments for `breakpointLocations` request.
|
|
struct BreakpointLocationsArguments {
|
|
/// The source location of the breakpoints; either `source.path` or
|
|
/// `source.sourceReference` must be specified.
|
|
Source source;
|
|
|
|
/// Start line of range to search possible breakpoint locations in. If only
|
|
/// the line is specified, the request returns all possible locations in that
|
|
/// line.
|
|
uint32_t line;
|
|
|
|
/// Start position within `line` to search possible breakpoint locations in.
|
|
/// It is measured in UTF-16 code units and the client capability
|
|
/// `columnsStartAt1` determines whether it is 0- or 1-based. If no column is
|
|
/// given, the first position in the start line is assumed.
|
|
std::optional<uint32_t> column;
|
|
|
|
/// End line of range to search possible breakpoint locations in. If no end
|
|
/// line is given, then the end line is assumed to be the start line.
|
|
std::optional<uint32_t> endLine;
|
|
|
|
/// End position within `endLine` to search possible breakpoint locations in.
|
|
/// It is measured in UTF-16 code units and the client capability
|
|
/// `columnsStartAt1` determines whether it is 0- or 1-based. If no end column
|
|
/// is given, the last position in the end line is assumed.
|
|
std::optional<uint32_t> endColumn;
|
|
};
|
|
bool fromJSON(const llvm::json::Value &, BreakpointLocationsArguments &,
|
|
llvm::json::Path);
|
|
|
|
/// Response to `breakpointLocations` request.
|
|
struct BreakpointLocationsResponseBody {
|
|
/// Content of the source reference.
|
|
std::vector<BreakpointLocation> breakpoints;
|
|
};
|
|
llvm::json::Value toJSON(const BreakpointLocationsResponseBody &);
|
|
|
|
/// Arguments for `setBreakpoints` request.
|
|
struct SetBreakpointsArguments {
|
|
/// The source location of the breakpoints; either `source.path` or
|
|
/// `source.sourceReference` must be specified.
|
|
Source source;
|
|
|
|
/// The code locations of the breakpoints.
|
|
std::optional<std::vector<SourceBreakpoint>> breakpoints;
|
|
|
|
/// Deprecated: The code locations of the breakpoints.
|
|
std::optional<std::vector<uint32_t>> lines;
|
|
|
|
/// A value of true indicates that the underlying source has been modified
|
|
/// which results in new breakpoint locations.
|
|
std::optional<bool> sourceModified;
|
|
};
|
|
bool fromJSON(const llvm::json::Value &, SetBreakpointsArguments &,
|
|
llvm::json::Path);
|
|
|
|
/// Response to `setBreakpoints` request.
|
|
/// Returned is information about each breakpoint created by this request.
|
|
/// This includes the actual code location and whether the breakpoint could be
|
|
/// verified. The breakpoints returned are in the same order as the elements of
|
|
/// the breakpoints (or the deprecated lines) array in the arguments.
|
|
struct SetBreakpointsResponseBody {
|
|
/// Information about the breakpoints.
|
|
/// The array elements are in the same order as the elements of the
|
|
/// `breakpoints` (or the deprecated `lines`) array in the arguments.
|
|
std::vector<Breakpoint> breakpoints;
|
|
};
|
|
llvm::json::Value toJSON(const SetBreakpointsResponseBody &);
|
|
|
|
/// Arguments for `setFunctionBreakpoints` request.
|
|
struct SetFunctionBreakpointsArguments {
|
|
/// The function names of the breakpoints.
|
|
std::vector<FunctionBreakpoint> breakpoints;
|
|
};
|
|
bool fromJSON(const llvm::json::Value &, SetFunctionBreakpointsArguments &,
|
|
llvm::json::Path);
|
|
|
|
/// Response to `setFunctionBreakpoints` request.
|
|
/// Returned is information about each breakpoint created by this request.
|
|
struct SetFunctionBreakpointsResponseBody {
|
|
/// Information about the breakpoints. The array elements correspond to the
|
|
/// elements of the `breakpoints` array.
|
|
std::vector<Breakpoint> breakpoints;
|
|
};
|
|
llvm::json::Value toJSON(const SetFunctionBreakpointsResponseBody &);
|
|
|
|
/// Arguments for `setInstructionBreakpoints` request.
|
|
struct SetInstructionBreakpointsArguments {
|
|
/// The instruction references of the breakpoints.
|
|
std::vector<InstructionBreakpoint> breakpoints;
|
|
};
|
|
bool fromJSON(const llvm::json::Value &, SetInstructionBreakpointsArguments &,
|
|
llvm::json::Path);
|
|
|
|
/// Response to `setInstructionBreakpoints` request.
|
|
struct SetInstructionBreakpointsResponseBody {
|
|
/// Information about the breakpoints. The array elements correspond to the
|
|
/// elements of the `breakpoints` array.
|
|
std::vector<Breakpoint> breakpoints;
|
|
};
|
|
llvm::json::Value toJSON(const SetInstructionBreakpointsResponseBody &);
|
|
|
|
/// Arguments for `dataBreakpointInfo` request.
|
|
struct DataBreakpointInfoArguments {
|
|
/// Reference to the variable container if the data breakpoint is requested
|
|
/// for a child of the container. The `variablesReference` must have been
|
|
/// obtained in the current suspended state.See 'Lifetime of Object
|
|
/// References' in the Overview section for details.
|
|
std::optional<int64_t> variablesReference;
|
|
|
|
/// The name of the variable's child to obtain data breakpoint information
|
|
/// for. If `variablesReference` isn't specified, this can be an expression,
|
|
/// or an address if `asAddress` is also true.
|
|
std::string name;
|
|
|
|
/// When `name` is an expression, evaluate it in the scope of this stack
|
|
/// frame. If not specified, the expression is evaluated in the global scope.
|
|
/// When `asAddress` is true, the `frameId` is ignored.
|
|
std::optional<uint64_t> frameId;
|
|
|
|
/// If specified, a debug adapter should return information for the range of
|
|
/// memory extending `bytes` number of bytes from the address or variable
|
|
/// specified by `name`. Breakpoints set using the resulting data ID should
|
|
/// pause on data access anywhere within that range.
|
|
/// Clients may set this property only if the `supportsDataBreakpointBytes`
|
|
/// capability is true.
|
|
std::optional<int64_t> bytes;
|
|
|
|
/// If `true`, the `name` is a memory address and the debugger should
|
|
/// interpret it as a decimal value, or hex value if it is prefixed with `0x`.
|
|
/// Clients may set this property only if the `supportsDataBreakpointBytes`
|
|
/// capability is true.
|
|
std::optional<bool> asAddress;
|
|
|
|
/// The mode of the desired breakpoint. If defined, this must be one of the
|
|
/// `breakpointModes` the debug adapter advertised in its `Capabilities`.
|
|
std::optional<std::string> mode;
|
|
};
|
|
bool fromJSON(const llvm::json::Value &, DataBreakpointInfoArguments &,
|
|
llvm::json::Path);
|
|
|
|
/// Response to `dataBreakpointInfo` request.
|
|
struct DataBreakpointInfoResponseBody {
|
|
/// An identifier for the data on which a data breakpoint can be registered
|
|
/// with the `setDataBreakpoints` request or null if no data breakpoint is
|
|
/// available. If a `variablesReference` or `frameId` is passed, the `dataId`
|
|
/// is valid in the current suspended state, otherwise it's valid
|
|
/// indefinitely. See 'Lifetime of Object References' in the Overview section
|
|
/// for details. Breakpoints set using the `dataId` in the
|
|
/// `setDataBreakpoints` request may outlive the lifetime of the associated
|
|
/// `dataId`.
|
|
std::optional<std::string> dataId;
|
|
|
|
/// UI string that describes on what data the breakpoint is set on or why a
|
|
/// data breakpoint is not available.
|
|
std::string description;
|
|
|
|
/// Attribute lists the available access types for a potential data
|
|
/// breakpoint. A UI client could surface this information.
|
|
std::optional<std::vector<DataBreakpointAccessType>> accessTypes;
|
|
|
|
/// Attribute indicates that a potential data breakpoint could be persisted
|
|
/// across sessions.
|
|
std::optional<bool> canPersist;
|
|
};
|
|
llvm::json::Value toJSON(const DataBreakpointInfoResponseBody &);
|
|
|
|
/// Arguments for `setDataBreakpoints` request.
|
|
struct SetDataBreakpointsArguments {
|
|
/// The contents of this array replaces all existing data breakpoints. An
|
|
/// empty array clears all data breakpoints.
|
|
std::vector<DataBreakpoint> breakpoints;
|
|
};
|
|
bool fromJSON(const llvm::json::Value &, SetDataBreakpointsArguments &,
|
|
llvm::json::Path);
|
|
|
|
/// Response to `setDataBreakpoints` request.
|
|
struct SetDataBreakpointsResponseBody {
|
|
/// Information about the data breakpoints. The array elements correspond to
|
|
/// the elements of the input argument `breakpoints` array.
|
|
std::vector<Breakpoint> breakpoints;
|
|
};
|
|
llvm::json::Value toJSON(const SetDataBreakpointsResponseBody &);
|
|
|
|
/// Arguments for `setExceptionBreakpoints` request.
|
|
struct SetExceptionBreakpointsArguments {
|
|
/// Set of exception filters specified by their ID. The set of all possible
|
|
/// exception filters is defined by the `exceptionBreakpointFilters`
|
|
/// capability. The `filter` and `filterOptions` sets are additive.
|
|
std::vector<std::string> filters;
|
|
|
|
/// Set of exception filters and their options. The set of all possible
|
|
/// exception filters is defined by the `exceptionBreakpointFilters`
|
|
/// capability. This attribute is only honored by a debug adapter if the
|
|
/// corresponding capability `supportsExceptionFilterOptions` is true. The
|
|
/// `filter` and `filterOptions` sets are additive.
|
|
std::vector<ExceptionFilterOptions> filterOptions;
|
|
|
|
// unsupported keys: exceptionOptions
|
|
};
|
|
bool fromJSON(const llvm::json::Value &, SetExceptionBreakpointsArguments &,
|
|
llvm::json::Path);
|
|
|
|
/// Response to `setExceptionBreakpoints` request.
|
|
///
|
|
/// The response contains an array of `Breakpoint` objects with information
|
|
/// about each exception breakpoint or filter. The `Breakpoint` objects are in
|
|
/// the same order as the elements of the `filters`, `filterOptions`,
|
|
/// `exceptionOptions` arrays given as arguments. If both `filters` and
|
|
/// `filterOptions` are given, the returned array must start with `filters`
|
|
/// information first, followed by `filterOptions` information.
|
|
///
|
|
/// The `verified` property of a `Breakpoint` object signals whether the
|
|
/// exception breakpoint or filter could be successfully created and whether the
|
|
/// condition is valid. In case of an error the `message` property explains the
|
|
/// problem. The `id` property can be used to introduce a unique ID for the
|
|
/// exception breakpoint or filter so that it can be updated subsequently by
|
|
/// sending breakpoint events.
|
|
///
|
|
/// For backward compatibility both the `breakpoints` array and the enclosing
|
|
/// `body` are optional. If these elements are missing a client is not able to
|
|
/// show problems for individual exception breakpoints or filters.
|
|
struct SetExceptionBreakpointsResponseBody {
|
|
/// Information about the exception breakpoints or filters.
|
|
///
|
|
/// The breakpoints returned are in the same order as the elements of the
|
|
/// `filters`, `filterOptions`, `exceptionOptions` arrays in the arguments. If
|
|
/// both `filters` and `filterOptions` are given, the returned array must
|
|
/// start with `filters` information first, followed by `filterOptions`
|
|
/// information.
|
|
std::vector<Breakpoint> breakpoints;
|
|
};
|
|
llvm::json::Value toJSON(const SetExceptionBreakpointsResponseBody &);
|
|
|
|
/// Arguments to `disassemble` request.
|
|
struct DisassembleArguments {
|
|
/// Memory reference to the base location containing the instructions to
|
|
/// disassemble.
|
|
lldb::addr_t memoryReference = LLDB_INVALID_ADDRESS;
|
|
|
|
/// Offset (in bytes) to be applied to the reference location before
|
|
/// disassembling. Can be negative.
|
|
int64_t offset = 0;
|
|
|
|
/// Offset (in instructions) to be applied after the byte offset (if any)
|
|
/// before disassembling. Can be negative.
|
|
int64_t instructionOffset = 0;
|
|
|
|
/// Number of instructions to disassemble starting at the specified location
|
|
/// and offset.
|
|
/// An adapter must return exactly this number of instructions - any
|
|
/// unavailable instructions should be replaced with an implementation-defined
|
|
/// 'invalid instruction' value.
|
|
uint32_t instructionCount = 0;
|
|
|
|
/// If true, the adapter should attempt to resolve memory addresses and other
|
|
/// values to symbolic names.
|
|
bool resolveSymbols = false;
|
|
};
|
|
bool fromJSON(const llvm::json::Value &, DisassembleArguments &,
|
|
llvm::json::Path);
|
|
llvm::json::Value toJSON(const DisassembleArguments &);
|
|
|
|
/// Response to `disassemble` request.
|
|
struct DisassembleResponseBody {
|
|
/// The list of disassembled instructions.
|
|
std::vector<DisassembledInstruction> instructions;
|
|
};
|
|
bool fromJSON(const llvm::json::Value &, DisassembleResponseBody &,
|
|
llvm::json::Path);
|
|
llvm::json::Value toJSON(const DisassembleResponseBody &);
|
|
|
|
/// Arguments for `readMemory` request.
|
|
struct ReadMemoryArguments {
|
|
/// Memory reference to the base location from which data should be read.
|
|
lldb::addr_t memoryReference = LLDB_INVALID_ADDRESS;
|
|
|
|
/// Offset (in bytes) to be applied to the reference location before reading
|
|
/// data. Can be negative.
|
|
int64_t offset = 0;
|
|
|
|
/// Number of bytes to read at the specified location and offset.
|
|
uint64_t count = 0;
|
|
};
|
|
bool fromJSON(const llvm::json::Value &, ReadMemoryArguments &,
|
|
llvm::json::Path);
|
|
|
|
/// Response to `readMemory` request.
|
|
struct ReadMemoryResponseBody {
|
|
/// The address of the first byte of data returned.
|
|
/// Treated as a hex value if prefixed with `0x`, or as a decimal value
|
|
/// otherwise.
|
|
lldb::addr_t address = LLDB_INVALID_ADDRESS;
|
|
|
|
/// The number of unreadable bytes encountered after the last successfully
|
|
/// read byte.
|
|
/// This can be used to determine the number of bytes that should be skipped
|
|
/// before a subsequent `readMemory` request succeeds.
|
|
uint64_t unreadableBytes = 0;
|
|
|
|
/// The bytes read from memory, encoded using base64. If the decoded length
|
|
/// of `data` is less than the requested `count` in the original `readMemory`
|
|
/// request, and `unreadableBytes` is zero or omitted, then the client should
|
|
/// assume it's reached the end of readable memory.
|
|
std::vector<std::byte> data;
|
|
};
|
|
llvm::json::Value toJSON(const ReadMemoryResponseBody &);
|
|
|
|
/// Arguments for `modules` request.
|
|
struct ModulesArguments {
|
|
/// The index of the first module to return; if omitted modules start at 0.
|
|
uint32_t startModule = 0;
|
|
|
|
/// The number of modules to return. If `moduleCount` is not specified or 0,
|
|
/// all modules are returned.
|
|
uint32_t moduleCount = 0;
|
|
};
|
|
bool fromJSON(const llvm::json::Value &, ModulesArguments &, llvm::json::Path);
|
|
|
|
/// Response to `modules` request.
|
|
struct ModulesResponseBody {
|
|
/// All modules or range of modules.
|
|
std::vector<Module> modules;
|
|
|
|
/// The total number of modules available.
|
|
uint32_t totalModules = 0;
|
|
};
|
|
llvm::json::Value toJSON(const ModulesResponseBody &);
|
|
|
|
/// Arguments for `variables` request.
|
|
struct VariablesArguments {
|
|
/// The variable for which to retrieve its children. The `variablesReference`
|
|
/// must have been obtained in the current suspended state. See 'Lifetime of
|
|
/// Object References' in the Overview section for details.
|
|
uint64_t variablesReference;
|
|
|
|
enum VariablesFilter : unsigned {
|
|
eVariablesFilterBoth = 0,
|
|
eVariablesFilterIndexed = 1 << 0,
|
|
eVariablesFilterNamed = 1 << 1,
|
|
};
|
|
|
|
/// Filter to limit the child variables to either named or indexed. If
|
|
/// omitted, both types are fetched.
|
|
VariablesFilter filter = eVariablesFilterBoth;
|
|
|
|
/// The index of the first variable to return; if omitted children start at 0.
|
|
///
|
|
/// The attribute is only honored by a debug adapter if the corresponding
|
|
/// capability `supportsVariablePaging` is true.
|
|
uint64_t start = 0;
|
|
|
|
/// The number of variables to return. If count is missing or 0, all variables
|
|
/// are returned.
|
|
///
|
|
/// The attribute is only honored by a debug adapter if the corresponding
|
|
/// capability `supportsVariablePaging` is true.
|
|
uint64_t count = 0;
|
|
|
|
/// Specifies details on how to format the Variable values.
|
|
///
|
|
/// The attribute is only honored by a debug adapter if the corresponding
|
|
/// capability `supportsValueFormattingOptions` is true.
|
|
std::optional<ValueFormat> format;
|
|
};
|
|
bool fromJSON(const llvm::json::Value &Param,
|
|
VariablesArguments::VariablesFilter &VA, llvm::json::Path Path);
|
|
bool fromJSON(const llvm::json::Value &, VariablesArguments &,
|
|
llvm::json::Path);
|
|
|
|
/// Response to `variables` request.
|
|
struct VariablesResponseBody {
|
|
/// All (or a range) of variables for the given variable reference.
|
|
std::vector<Variable> variables;
|
|
};
|
|
llvm::json::Value toJSON(const VariablesResponseBody &);
|
|
|
|
/// Arguments for `writeMemory` request.
|
|
struct WriteMemoryArguments {
|
|
/// Memory reference to the base location to which data should be written.
|
|
lldb::addr_t memoryReference = LLDB_INVALID_ADDRESS;
|
|
|
|
/// Offset (in bytes) to be applied to the reference location before writing
|
|
/// data. Can be negative.
|
|
int64_t offset = 0;
|
|
|
|
/// Property to control partial writes. If true, the debug adapter should
|
|
/// attempt to write memory even if the entire memory region is not writable.
|
|
/// In such a case the debug adapter should stop after hitting the first byte
|
|
/// of memory that cannot be written and return the number of bytes written in
|
|
/// the response via the `offset` and `bytesWritten` properties.
|
|
/// If false or missing, a debug adapter should attempt to verify the region
|
|
/// is writable before writing, and fail the response if it is not.
|
|
bool allowPartial = false;
|
|
|
|
/// Bytes to write, encoded using base64.
|
|
std::string data;
|
|
};
|
|
bool fromJSON(const llvm::json::Value &, WriteMemoryArguments &,
|
|
llvm::json::Path);
|
|
|
|
/// Response to writeMemory request.
|
|
struct WriteMemoryResponseBody {
|
|
/// Property that should be returned when `allowPartial` is true to indicate
|
|
/// the number of bytes starting from address that were successfully written.
|
|
uint64_t bytesWritten = 0;
|
|
};
|
|
llvm::json::Value toJSON(const WriteMemoryResponseBody &);
|
|
|
|
struct ModuleSymbolsArguments {
|
|
/// The module UUID for which to retrieve symbols.
|
|
std::string moduleId;
|
|
|
|
/// The module path.
|
|
std::string moduleName;
|
|
|
|
/// The index of the first symbol to return; if omitted, start at the
|
|
/// beginning.
|
|
std::optional<uint32_t> startIndex;
|
|
|
|
/// The number of symbols to return; if omitted, all symbols are returned.
|
|
std::optional<uint32_t> count;
|
|
};
|
|
bool fromJSON(const llvm::json::Value &, ModuleSymbolsArguments &,
|
|
llvm::json::Path);
|
|
|
|
/// Response to `getModuleSymbols` request.
|
|
struct ModuleSymbolsResponseBody {
|
|
/// The symbols for the specified module.
|
|
std::vector<Symbol> symbols;
|
|
};
|
|
llvm::json::Value toJSON(const ModuleSymbolsResponseBody &);
|
|
|
|
} // namespace lldb_dap::protocol
|
|
|
|
#endif
|