forked from OSchip/llvm-project
137 lines
5.1 KiB
Markdown
137 lines
5.1 KiB
Markdown
# Change Notes
|
|
|
|
## Overview
|
|
|
|
This document describes an infrastructural feature called Structured
|
|
Data plugins. See the DarwinLog.md doc for a description of one
|
|
such plugin that makes use of this feature.
|
|
|
|
## StructuredDataPlugin
|
|
|
|
StructuredDataPlugin instances have the following characteristics:
|
|
|
|
* Each plugin instance is bound to a single Process instance.
|
|
|
|
* Each StructuredData feature has a type name that identifies the
|
|
feature. For instance, the type name for the DarwinLog feature is
|
|
"DarwinLog". This feature type name is used in various places.
|
|
|
|
* The process monitor reports the list of supported StructuredData
|
|
features advertised by the process monitor. Process goes through the
|
|
list of supported feature type names, and asks each known
|
|
StructuredDataPlugin if it can handle the feature. The first plugin
|
|
that supports the feature is mapped to that Process instance for
|
|
that feature. Plugins are only mapped when the process monitor
|
|
advertises that a feature is supported.
|
|
|
|
* The feature may send asynchronous messages in StructuredData format
|
|
to the Process instance. Process instances route the asynchronous
|
|
structured data messages to the plugin mapped to that feature type,
|
|
if one exists.
|
|
|
|
* Plugins can request that the Process instance forward on
|
|
configuration data to the process monitor if the plugin needs/wants
|
|
to configure the feature. Plugins may call the new Process method
|
|
|
|
```C++
|
|
virtual Error
|
|
ConfigureStructuredData(const ConstString &type_name,
|
|
const StructuredData::ObjectSP &config_sp)
|
|
```
|
|
|
|
where type_name is the feature name and config_sp points to the
|
|
configuration structured data, which may be nullptr.
|
|
|
|
* Plugins for features present in a process are notified when modules
|
|
are loaded into the Process instance via this StructuredDataPlugin
|
|
method:
|
|
|
|
```C++
|
|
virtual void
|
|
ModulesDidLoad(Process &process, ModuleList &module_list);
|
|
```
|
|
|
|
* Plugins may optionally broadcast their received structured data as
|
|
an LLDB process-level event via the following new Process call:
|
|
|
|
```C++
|
|
void
|
|
BroadcastStructuredData(const StructuredData::ObjectSP &object_sp,
|
|
const lldb::StructuredDataPluginSP &plugin_sp);
|
|
```
|
|
|
|
IDE clients might use this feature to receive information about the
|
|
process as it is running to monitor memory usage, CPU usage, and
|
|
logging.
|
|
|
|
Internally, the event type created is an instance of
|
|
EventDataStructuredData.
|
|
|
|
* In the case where a plugin chooses to broadcast a received
|
|
StructuredData event, the command-line LLDB Debugger instance
|
|
listens for them. The Debugger instance then gives the plugin an
|
|
opportunity to display info to either the debugger output or error
|
|
stream at a time that is safe to write to them. The plugin can
|
|
choose to display something appropriate regarding the structured
|
|
data that time.
|
|
|
|
* Plugins can provide a ProcessLaunchInfo filter method when the
|
|
plugin is registered. If such a filter method is provided, then
|
|
when a process is about to be launched for debugging, the filter
|
|
callback is invoked, given both the launch info and the target. The
|
|
plugin may then alter the launch info if needed to better support
|
|
the feature of the plugin.
|
|
|
|
* The plugin is entirely independent of the type of Process-derived
|
|
class that it is working with. The only requirements from the
|
|
process monitor are the following feature-agnostic elements:
|
|
|
|
* Provide a way to discover features supported by the process
|
|
monitor for the current process.
|
|
|
|
* Specify the list of supported feature type names to Process.
|
|
The process monitor does this by calling the following new
|
|
method on Process:
|
|
|
|
```C++
|
|
void
|
|
MapSupportedStructuredDataPlugins(const StructuredData::Array
|
|
&supported_type_names)
|
|
```
|
|
|
|
The supported_type_names specifies an array of string entries,
|
|
where each entry specifies the name of a StructuredData feature.
|
|
|
|
* Provide a way to forward on configuration data for a feature type
|
|
to the process monitor. This is the manner by which LLDB can
|
|
configure a feature, perhaps based on settings or commands from
|
|
the user. The following virtual method on Process (described
|
|
earlier) does the job:
|
|
|
|
```C++
|
|
virtual Error
|
|
ConfigureStructuredData(const ConstString &type_name,
|
|
const StructuredData::ObjectSP &config_sp)
|
|
```
|
|
|
|
* Listen for asynchronous structured data packets from the process
|
|
monitor, and forward them on to Process via this new Process
|
|
member method:
|
|
|
|
```C++
|
|
bool
|
|
RouteAsyncStructuredData(const StructuredData::ObjectSP object_sp)
|
|
```
|
|
|
|
* StructuredData producers must send their top-level data as a
|
|
Dictionary type, with a key called 'type' specifying a string value,
|
|
where the value is equal to the StructuredData feature/type name
|
|
previously advertised. Everything else about the content of the
|
|
dictionary is entirely up to the feature.
|
|
|
|
* StructuredDataPlugin commands show up under 'plugin structured-data
|
|
plugin-name'.
|
|
|
|
* StructuredDataPlugin settings show up under
|
|
'plugin.structured-data.{plugin-name}.
|