[Lldb-commits] [lldb] r279198 - Add StructuredData plugin type; showcase with new DarwinLog feature

Todd Fiala via lldb-commits lldb-commits at lists.llvm.org
Fri Aug 19 08:56:03 PDT 2016


Ah okay. I usually type LLDB and it auto completes to the right thing. I
wonder if a new id with name LLDB was added - it appears to be valid - and
if that short circuited my normal lookup process. I'll look into that to
see if that's the case, as this probably won't be the only time when that
will happen.

-Todd

On Friday, August 19, 2016, Pavel Labath <labath at google.com> wrote:

> You added LLDB as a subsriber. I don't know what that is, but the
> correct name for the list is "lldb-commits".
>
> pl
>
> On 19 August 2016 at 04:54, Todd Fiala via lldb-commits
> <lldb-commits at lists.llvm.org> wrote:
> > Huh, that is totally weird.  I wonder what happened there?
> >
> > On Thu, Aug 18, 2016 at 8:12 PM, Zachary Turner <zturner at google.com>
> wrote:
> >>
> >> Weird, you linked to a phabricator revision but i never saw it come
> across
> >> to the mailing list
> >>
> >> On Thu, Aug 18, 2016 at 8:00 PM Todd Fiala via lldb-commits
> >> <lldb-commits at lists.llvm.org> wrote:
> >>>
> >>> Author: tfiala
> >>> Date: Thu Aug 18 21:52:07 2016
> >>> New Revision: 279198
> >>>
> >>> URL: http://llvm.org/viewvc/llvm-project?rev=279198&view=rev
> >>> Log:
> >>> Add StructuredData plugin type; showcase with new DarwinLog feature
> >>>
> >>> See docs/structured_data/StructuredDataPlugins.md for details.
> >>>
> >>> differential review: https://reviews.llvm.org/D22976
> >>>
> >>> reviewers: clayborg, jingham
> >>>
> >>> Added:
> >>>     lldb/trunk/docs/structured_data/
> >>>     lldb/trunk/docs/structured_data/DarwinLog.md
> >>>     lldb/trunk/docs/structured_data/StructuredDataPlugins.md
> >>>     lldb/trunk/include/lldb/API/SBStructuredData.h
> >>>     lldb/trunk/include/lldb/Target/StructuredDataPlugin.h
> >>>     lldb/trunk/include/lldb/Target/ThreadPlanCallOnFunctionExit.h
> >>>     lldb/trunk/packages/Python/lldbsuite/test/darwin_log.py
> >>>     lldb/trunk/packages/Python/lldbsuite/test/
> functionalities/darwin_log/
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> basic/
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> basic/Makefile
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> basic/TestDarwinLogBasic.py
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> basic/main.c
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> common/
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> common/darwin_log_common.h
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> filter/
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> filter/exact_match/
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> filter/exact_match/activity/
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> filter/exact_match/activity-chain/
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> filter/exact_match/activity-chain/Makefile
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> filter/exact_match/activity-chain/TestDarwinLogFilterMatchActivityChain.py
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> filter/exact_match/activity-chain/main.c
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> filter/exact_match/activity/Makefile
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> filter/exact_match/activity/TestDarwinLogFilterMatchActivity.py
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> filter/exact_match/activity/main.c
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> filter/exact_match/category/
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> filter/exact_match/category/Makefile
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> filter/exact_match/category/TestDarwinLogFilterMatchCategory.py
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> filter/exact_match/category/main.c
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> filter/exact_match/message/
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> filter/exact_match/message/Makefile
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> filter/exact_match/message/TestDarwinLogFilterMatchMessage.py
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> filter/exact_match/message/main.c
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> filter/exact_match/subsystem/
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> filter/exact_match/subsystem/Makefile
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> filter/exact_match/subsystem/TestDarwinLogFilterMatchSubsystem.py
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> filter/exact_match/subsystem/main.c
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> filter/regex/
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> filter/regex/activity/
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> filter/regex/activity-chain/
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> filter/regex/activity-chain/Makefile
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> filter/regex/activity-chain/TestDarwinLogFilterRegexActivityChain.py
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> filter/regex/activity-chain/main.c
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> filter/regex/activity/Makefile
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> filter/regex/activity/TestDarwinLogFilterRegexActivity.py
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> filter/regex/activity/main.c
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> filter/regex/category/
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> filter/regex/category/Makefile
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> filter/regex/category/TestDarwinLogFilterRegexCategory.py
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> filter/regex/category/main.c
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> filter/regex/message/
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> filter/regex/message/Makefile
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> filter/regex/message/TestDarwinLogFilterRegexMessage.py
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> filter/regex/message/main.c
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> filter/regex/subsystem/
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> filter/regex/subsystem/Makefile
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> filter/regex/subsystem/TestDarwinLogFilterRegexSubsystem.py
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> filter/regex/subsystem/main.c
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> format/
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> format/Makefile
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> format/TestDarwinLogMessageFormat.py
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> format/main.c
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> source/
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> source/debug/
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> source/debug/Makefile
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> source/debug/TestDarwinLogSourceDebug.py
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> source/debug/main.c
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> source/info/
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> source/info/Makefile
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> source/info/TestDarwinLogSourceInfo.py
> >>>
> >>> lldb/trunk/packages/Python/lldbsuite/test/functionalities/darwin_log/
> source/info/main.c
> >>>     lldb/trunk/scripts/interface/SBStructuredData.i
> >>>     lldb/trunk/source/API/SBStructuredData.cpp
> >>>     lldb/trunk/source/Plugins/StructuredData/
> >>>     lldb/trunk/source/Plugins/StructuredData/CMakeLists.txt
> >>>     lldb/trunk/source/Plugins/StructuredData/DarwinLog/
> >>>     lldb/trunk/source/Plugins/StructuredData/DarwinLog/CMakeLists.txt
> >>>
> >>> lldb/trunk/source/Plugins/StructuredData/DarwinLog/
> StructuredDataDarwinLog.cpp
> >>>
> >>> lldb/trunk/source/Plugins/StructuredData/DarwinLog/
> StructuredDataDarwinLog.h
> >>>     lldb/trunk/source/Target/StructuredDataPlugin.cpp
> >>>     lldb/trunk/source/Target/ThreadPlanCallOnFunctionExit.cpp
> >>>     lldb/trunk/tools/debugserver/source/JSON.cpp
> >>>     lldb/trunk/tools/debugserver/source/JSON.h
> >>>     lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/
> >>>
> >>> lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/ActivityStore.cpp
> >>>     lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/
> ActivityStore.h
> >>>
> >>> lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/
> ActivityStreamSPI.h
> >>>     lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/
> CMakeLists.txt
> >>>
> >>> lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/
> DarwinLogCollector.cpp
> >>>
> >>> lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/
> DarwinLogCollector.h
> >>>     lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/
> DarwinLogEvent.h
> >>>
> >>> lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/
> DarwinLogInterfaces.h
> >>>     lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/
> DarwinLogTypes.h
> >>>     lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/LogFilter.cpp
> >>>     lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/LogFilter.h
> >>>
> >>> lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/
> LogFilterChain.cpp
> >>>     lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/
> LogFilterChain.h
> >>>
> >>> lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/
> LogFilterExactMatch.cpp
> >>>
> >>> lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/
> LogFilterExactMatch.h
> >>>
> >>> lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/
> LogFilterRegex.cpp
> >>>     lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/
> LogFilterRegex.h
> >>>     lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/
> LogMessage.cpp
> >>>     lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/LogMessage.h
> >>>
> >>> lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/
> LogMessageOsLog.cpp
> >>>
> >>> lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/LogMessageOsLog.h
> >>>     lldb/trunk/tools/debugserver/source/MacOSX/OsLogger.cpp
> >>>     lldb/trunk/tools/debugserver/source/MacOSX/OsLogger.h
> >>> Modified:
> >>>     lldb/trunk/.gitignore
> >>>     lldb/trunk/cmake/LLDBDependencies.cmake
> >>>     lldb/trunk/include/lldb/API/LLDB.h
> >>>     lldb/trunk/include/lldb/API/SBDefines.h
> >>>     lldb/trunk/include/lldb/API/SBError.h
> >>>     lldb/trunk/include/lldb/API/SBProcess.h
> >>>     lldb/trunk/include/lldb/API/SBStream.h
> >>>     lldb/trunk/include/lldb/Core/Broadcaster.h
> >>>     lldb/trunk/include/lldb/Core/Event.h
> >>>     lldb/trunk/include/lldb/Core/PluginManager.h
> >>>     lldb/trunk/include/lldb/Interpreter/Args.h
> >>>     lldb/trunk/include/lldb/Target/Process.h
> >>>     lldb/trunk/include/lldb/lldb-forward.h
> >>>     lldb/trunk/include/lldb/lldb-private-interfaces.h
> >>>     lldb/trunk/lldb.xcodeproj/project.pbxproj
> >>>     lldb/trunk/scripts/interface/SBProcess.i
> >>>     lldb/trunk/scripts/interface/SBTarget.i
> >>>     lldb/trunk/scripts/lldb.swig
> >>>     lldb/trunk/source/API/CMakeLists.txt
> >>>     lldb/trunk/source/API/SBDebugger.cpp
> >>>     lldb/trunk/source/API/SBProcess.cpp
> >>>     lldb/trunk/source/API/SystemInitializerFull.cpp
> >>>     lldb/trunk/source/Core/Debugger.cpp
> >>>     lldb/trunk/source/Core/Event.cpp
> >>>     lldb/trunk/source/Core/PluginManager.cpp
> >>>     lldb/trunk/source/Interpreter/Args.cpp
> >>>     lldb/trunk/source/Plugins/Process/gdb-remote/
> GDBRemoteClientBase.cpp
> >>>     lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteClientBase.h
> >>>
> >>> lldb/trunk/source/Plugins/Process/gdb-remote/
> GDBRemoteCommunicationClient.cpp
> >>>
> >>> lldb/trunk/source/Plugins/Process/gdb-remote/
> GDBRemoteCommunicationClient.h
> >>>     lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
> >>>     lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h
> >>>     lldb/trunk/source/Target/CMakeLists.txt
> >>>     lldb/trunk/source/Target/Platform.cpp
> >>>     lldb/trunk/source/Target/Process.cpp
> >>>     lldb/trunk/tools/debugserver/debugserver.xcodeproj/project.pbxproj
> >>>     lldb/trunk/tools/debugserver/source/CMakeLists.txt
> >>>     lldb/trunk/tools/debugserver/source/DNB.cpp
> >>>     lldb/trunk/tools/debugserver/source/DNB.h
> >>>     lldb/trunk/tools/debugserver/source/DNBDefs.h
> >>>     lldb/trunk/tools/debugserver/source/MacOSX/CMakeLists.txt
> >>>     lldb/trunk/tools/debugserver/source/RNBContext.cpp
> >>>     lldb/trunk/tools/debugserver/source/RNBContext.h
> >>>     lldb/trunk/tools/debugserver/source/RNBRemote.cpp
> >>>     lldb/trunk/tools/debugserver/source/RNBRemote.h
> >>>     lldb/trunk/tools/debugserver/source/debugserver.cpp
> >>>     lldb/trunk/tools/lldb-mi/MICmnLLDBDebugger.cpp
> >>>     lldb/trunk/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.cpp
> >>>
> >>> Modified: lldb/trunk/.gitignore
> >>> URL:
> >>> http://llvm.org/viewvc/llvm-project/lldb/trunk/.gitignore?
> rev=279198&r1=279197&r2=279198&view=diff
> >>>
> >>> ============================================================
> ==================
> >>> --- lldb/trunk/.gitignore (original)
> >>> +++ lldb/trunk/.gitignore Thu Aug 18 21:52:07 2016
> >>> @@ -40,7 +40,18 @@ __pycache__/
> >>>
> >>>  clang-module-cache
> >>>
> >>> +# Skip ctags-style tags files
> >>> +tags
> >>> +
> >>>  # We should ignore Xcode-style embedding of llvm/ at lldb root dir.
> >>>  # Do not add trailing '/'s, they skip symlinks.
> >>>  /llvm
> >>>  /DerivedData
> >>> +
> >>> +# Ignore test trace directories.
> >>> +20??-??-??-??_??_??/
> >>> +
> >>> +# Ignore crashlog support files.
> >>> +crashinfo.lock
> >>> +crashinfo.so
> >>> +
> >>>
> >>> Modified: lldb/trunk/cmake/LLDBDependencies.cmake
> >>> URL:
> >>> http://llvm.org/viewvc/llvm-project/lldb/trunk/cmake/
> LLDBDependencies.cmake?rev=279198&r1=279197&r2=279198&view=diff
> >>>
> >>> ============================================================
> ==================
> >>> --- lldb/trunk/cmake/LLDBDependencies.cmake (original)
> >>> +++ lldb/trunk/cmake/LLDBDependencies.cmake Thu Aug 18 21:52:07 2016
> >>> @@ -47,6 +47,7 @@ set( LLDB_USED_LIBS
> >>>    lldbPluginObjectContainerMachOArchive
> >>>    lldbPluginObjectContainerBSDArchive
> >>>    lldbPluginPlatformMacOSX
> >>> +  lldbPluginStructuredDataDarwinLog
> >>>    lldbPluginDynamicLoaderMacOSXDYLD
> >>>    lldbPluginUnwindAssemblyInstEmulation
> >>>    lldbPluginUnwindAssemblyX86
> >>>
> >>> Added: lldb/trunk/docs/structured_data/DarwinLog.md
> >>> URL:
> >>> http://llvm.org/viewvc/llvm-project/lldb/trunk/docs/
> structured_data/DarwinLog.md?rev=279198&view=auto
> >>>
> >>> ============================================================
> ==================
> >>> --- lldb/trunk/docs/structured_data/DarwinLog.md (added)
> >>> +++ lldb/trunk/docs/structured_data/DarwinLog.md Thu Aug 18 21:52:07
> 2016
> >>> @@ -0,0 +1,160 @@
> >>> +# Change Notes
> >>> +
> >>> +## Summary
> >>> +
> >>> +This document describes the DarwinLog logging feature.
> >>> +
> >>> +## StructuredDataDarwinLog feature
> >>> +
> >>> +The DarwinLog feature supports logging os_log*() and NSLog() messages
> >>> +to the command-line lldb console, as well as making those messages
> >>> +available to LLDB clients via the event system.  Starting with fall
> >>> +2016 OSes, Apple platforms introduce a new fire-hose, stream-style
> >>> +logging system where the bulk of the log processing happens on the log
> >>> +consumer side.  This reduces logging impact on the system when there
> >>> +are no consumers, making it cheaper to include logging at all times.
> >>> +However, it also increases the work needed on the consumer end when
> >>> +log messages are desired.
> >>> +
> >>> +The debugserver binary has been modified to support collection of
> >>> +os_log*()/NSLog() messages, selection of which messages appear in the
> >>> +stream, and fine-grained filtering of what gets passed on to the LLDB
> >>> +client.  DarwinLog also tracks the activity chain (i.e. os_activity()
> >>> +hierarchy) in effect at the time the log messages were issued.  The
> >>> +user is able to configure a number of aspects related to the
> >>> +formatting of the log message header fields.
> >>> +
> >>> +The DarwinLog support is written in a way which should support the
> >>> +lldb client side on non-Apple clients talking to an Apple device or
> >>> +macOS system; hence, the plugin support is built into all LLDB
> >>> +clients, not just those built on an Apple platform.
> >>> +
> >>> +StructuredDataDarwinLog implements the 'DarwinLog' feature type, and
> >>> +the plugin name for it shows up as 'darwin-log'.
> >>> +
> >>> +The user interface to the darwin-log support is via the following:
> >>> +
> >>> +* 'plugin structured-data darwin-log enable' command
> >>> +
> >>> +  This is the main entry point for enabling the command.  It can be
> >>> +  set before launching a process or while the process is running.
> >>> +  If the user wants to squelch seeing info-level or debug-level
> >>> +  messages, which is the default behavior, then the enable command
> >>> +  must be made prior to launching the process; otherwise, the
> >>> +  info-level and debug-level messages will always show up.  Also,
> >>> +  there is a similar "echo os_log()/NSLog() messages to target
> >>> +  process stderr" mechanism which is properly disabled when enabling
> >>> +  the DarwinLog support prior to launch.  This cannot be squelched
> >>> +  if enabling DarwinLog after launch.
> >>> +
> >>> +  See the help for this command.  There are a number of options
> >>> +  to shrink or expand the number of messages that are processed
> >>> +  on the remote side and sent over to the client, and other
> >>> +  options to control the formatting of messages displayed.
> >>> +
> >>> +  This command is sticky.  Once enabled, it will stay enabled for
> >>> +  future process launches.
> >>> +
> >>> +* 'plugin structured-data darwin-log disable' command
> >>> +
> >>> +  Executing this command disables os_log() capture in the currently
> >>> +  running process and signals LLDB to stop attempting to launch
> >>> +  new processes with DarwinLog support enabled.
> >>> +
> >>> +* 'settings set \
> >>> +  plugin.structured-data.darwin-log.enable-on-startup'
> >>> +
> >>> +  and
> >>> +
> >>> +  'settings set \
> >>> +  plugin.structured-data.darwin-log.auto-enable-options -- {options}'
> >>> +
> >>> +  When enable-on-startup is set to true, then LLDB will automatically
> >>> +  enable DarwinLog on startup of relevant processes.  It will use the
> >>> +  content provided in the auto-enable-options settings as the
> >>> +  options to pass to the enable command.
> >>> +
> >>> +  Note the '--' required after auto-enable-command.  That is necessary
> >>> +  for raw commands like settings set.  The '--' will not become part
> >>> +  of the options for the enable command.
> >>> +
> >>> +### Message flow and related performance considerations
> >>> +
> >>> +os_log()-style collection is not free.  The more data that must be
> >>> +processed, the slower it will be.  There are several knobs available
> >>> +to the developer to limit how much data goes through the pipe, and how
> >>> +much data ultimately goes over the wire to the LLDB client.  The
> >>> +user's goal should be to ensure he or she only collects as many log
> >>> +messages are needed, but no more.
> >>> +
> >>> +The flow of data looks like the following:
> >>> +
> >>> +1. Data comes into debugserver from the low-level OS facility that
> >>> +   receives log messages.  The data that comes through this pipe can
> >>> +   be limited or expanded by the '--debug', '--info' and
> >>> +   '--all-processes' options of the 'plugin structured-data darwin-log
> >>> +   enable' command.  options.  Exclude as many categories as possible
> >>> +   here (also the default).  The knobs here are very coarse - for
> >>> +   example, whether to include os_log_info()-level or
> >>> +   os_log_debug()-level info, or to include callstacks in the log
> >>> +   message event data.
> >>> +
> >>> +2. The debugserver process filters the messages that arrive through a
> >>> +   message log filter that may be fully customized by the user.  It
> >>> +   works similar to a rules-based packet filter: a set of rules are
> >>> +   matched against the log message, each rule tried in sequential
> >>> +   order.  The first rule that matches then either accepts or rejects
> >>> +   the message.  If the log message does not match any rule, then the
> >>> +   message gets the no-match (i.e. fall-through) action.  The no-match
> >>> +   action defaults to accepting but may be set to reject.
> >>> +
> >>> +   Filters can be added via the enable command's '--filter
> >>> +   {filter-spec}' option.  Filters are added in order, and multiple
> >>> +   --filter entries can be provided to the enable command.
> >>> +
> >>> +   Filters take the following form:
> >>> +
> >>> +   {action} {attribute} {op}
> >>> +
> >>> +   {action} :=
> >>> +       accept |
> >>> +       reject
> >>> +
> >>> +   {attribute} :=
> >>> +       category       |   // The log message category
> >>> +       subsystem      |   // The log message subsystem}
> >>> +       activity       |   // The child-most activity in force
> >>> +                          // at the time the message was logged.
> >>> +       activity-chain |   // The complete activity chain, specified
> >>> +                          // as {parent-activity}:{child-activity}:
> >>> +                          // {grandchild-activity}
> >>> +       message        |   // The fully expanded message contents.
> >>> +                          // Note this one is expensive because it
> >>> +                          // requires expanding the message.  Avoid
> >>> +                          // this if possible, or add it further
> >>> +                          // down the filter chain.
> >>> +
> >>> +   {op} :=
> >>> +              match {exact-match-text} |
> >>> +              regex {search-regex}        // uses C++ std::regex
> >>> +                                          // ECMAScript variant.
> >>> +
> >>> +e.g.
> >>> +   --filter "accept subsystem match com.example.mycompany.myproduct"
> >>> +   --filter "accept subsystem regex com.example.+"
> >>> +   --filter "reject category regex spammy-system-[[:digit:]]+"
> >>> +
> >>> +3. Messages that are accepted by the log message filter get sent to
> >>> +   the lldb client, where they are mapped to the
> >>> +   StructuredDataDarwinLog plugin.  By default, command-line lldb will
> >>> +   issue a Process-level event containing the log message content, and
> >>> +   will request the plugin to print the message if the plugin is
> >>> +   enabled to do so.
> >>> +
> >>> +### Log message display
> >>> +
> >>> +Several settings control aspects of displaying log messages in
> >>> +command-line LLDB.  See the enable command's help for a description
> >>> +of these.
> >>> +
> >>> +
> >>>
> >>> Added: lldb/trunk/docs/structured_data/StructuredDataPlugins.md
> >>> URL:
> >>> http://llvm.org/viewvc/llvm-project/lldb/trunk/docs/structured_data/
> StructuredDataPlugins.md?rev=279198&view=auto
> >>>
> >>> ============================================================
> ==================
> >>> --- lldb/trunk/docs/structured_data/StructuredDataPlugins.md (added)
> >>> +++ lldb/trunk/docs/structured_data/StructuredDataPlugins.md Thu Aug
> 18
> >>> 21:52:07 2016
> >>> @@ -0,0 +1,136 @@
> >>> +# 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}.
> >>>
> >>> Modified: lldb/trunk/include/lldb/API/LLDB.h
> >>> URL:
> >>> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/
> lldb/API/LLDB.h?rev=279198&r1=279197&r2=279198&view=diff
> >>>
> >>> ============================================================
> ==================
> >>> --- lldb/trunk/include/lldb/API/LLDB.h (original)
> >>> +++ lldb/trunk/include/lldb/API/LLDB.h Thu Aug 18 21:52:07 2016
> >>> @@ -55,6 +55,7 @@
> >>>  #include "lldb/API/SBSourceManager.h"
> >>>  #include "lldb/API/SBStream.h"
> >>>  #include "lldb/API/SBStringList.h"
> >>> +#include "lldb/API/SBStructuredData.h"
> >>>  #include "lldb/API/SBSymbol.h"
> >>>  #include "lldb/API/SBSymbolContext.h"
> >>>  #include "lldb/API/SBSymbolContextList.h"
> >>>
> >>> Modified: lldb/trunk/include/lldb/API/SBDefines.h
> >>> URL:
> >>> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/
> lldb/API/SBDefines.h?rev=279198&r1=279197&r2=279198&view=diff
> >>>
> >>> ============================================================
> ==================
> >>> --- lldb/trunk/include/lldb/API/SBDefines.h (original)
> >>> +++ lldb/trunk/include/lldb/API/SBDefines.h Thu Aug 18 21:52:07 2016
> >>> @@ -71,6 +71,7 @@ class LLDB_API SBSection;
> >>>  class LLDB_API SBSourceManager;
> >>>  class LLDB_API SBStream;
> >>>  class LLDB_API SBStringList;
> >>> +class LLDB_API SBStructuredData;
> >>>  class LLDB_API SBSymbol;
> >>>  class LLDB_API SBSymbolContext;
> >>>  class LLDB_API SBSymbolContextList;
> >>>
> >>> Modified: lldb/trunk/include/lldb/API/SBError.h
> >>> URL:
> >>> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/
> lldb/API/SBError.h?rev=279198&r1=279197&r2=279198&view=diff
> >>>
> >>> ============================================================
> ==================
> >>> --- lldb/trunk/include/lldb/API/SBError.h (original)
> >>> +++ lldb/trunk/include/lldb/API/SBError.h Thu Aug 18 21:52:07 2016
> >>> @@ -73,6 +73,7 @@ protected:
> >>>      friend class SBHostOS;
> >>>      friend class SBPlatform;
> >>>      friend class SBProcess;
> >>> +    friend class SBStructuredData;
> >>>      friend class SBThread;
> >>>      friend class SBTarget;
> >>>      friend class SBValue;
> >>>
> >>> Modified: lldb/trunk/include/lldb/API/SBProcess.h
> >>> URL:
> >>> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/
> lldb/API/SBProcess.h?rev=279198&r1=279197&r2=279198&view=diff
> >>>
> >>> ============================================================
> ==================
> >>> --- lldb/trunk/include/lldb/API/SBProcess.h (original)
> >>> +++ lldb/trunk/include/lldb/API/SBProcess.h Thu Aug 18 21:52:07 2016
> >>> @@ -32,7 +32,8 @@ public:
> >>>          eBroadcastBitInterrupt      = (1 << 1),
> >>>          eBroadcastBitSTDOUT         = (1 << 2),
> >>>          eBroadcastBitSTDERR         = (1 << 3),
> >>> -        eBroadcastBitProfileData    = (1 << 4)
> >>> +        eBroadcastBitProfileData    = (1 << 4),
> >>> +        eBroadcastBitStructuredData = (1 << 5)
> >>>      };
> >>>
> >>>      SBProcess ();
> >>> @@ -278,10 +279,16 @@ public:
> >>>
> >>>      static bool
> >>>      GetInterruptedFromEvent (const lldb::SBEvent &event);
> >>> -
> >>> +
> >>> +    static lldb::SBStructuredData
> >>> +    GetStructuredDataFromEvent (const lldb::SBEvent &event);
> >>> +
> >>>      static bool
> >>>      EventIsProcessEvent (const lldb::SBEvent &event);
> >>>
> >>> +    static bool
> >>> +    EventIsStructuredDataEvent (const lldb::SBEvent &event);
> >>> +
> >>>      lldb::SBBroadcaster
> >>>      GetBroadcaster () const;
> >>>
> >>>
> >>> Modified: lldb/trunk/include/lldb/API/SBStream.h
> >>> URL:
> >>> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/
> lldb/API/SBStream.h?rev=279198&r1=279197&r2=279198&view=diff
> >>>
> >>> ============================================================
> ==================
> >>> --- lldb/trunk/include/lldb/API/SBStream.h (original)
> >>> +++ lldb/trunk/include/lldb/API/SBStream.h Thu Aug 18 21:52:07 2016
> >>> @@ -83,6 +83,7 @@ protected:
> >>>      friend class SBProcess;
> >>>      friend class SBSection;
> >>>      friend class SBSourceManager;
> >>> +    friend class SBStructuredData;
> >>>      friend class SBSymbol;
> >>>      friend class SBSymbolContext;
> >>>      friend class SBSymbolContextList;
> >>>
> >>> Added: lldb/trunk/include/lldb/API/SBStructuredData.h
> >>> URL:
> >>> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/
> lldb/API/SBStructuredData.h?rev=279198&view=auto
> >>>
> >>> ============================================================
> ==================
> >>> --- lldb/trunk/include/lldb/API/SBStructuredData.h (added)
> >>> +++ lldb/trunk/include/lldb/API/SBStructuredData.h Thu Aug 18 21:52:07
> >>> 2016
> >>> @@ -0,0 +1,52 @@
> >>> +//===-- SBStructuredData.h --------------------------------------*-
> C++
> >>> -*-===//
> >>> +//
> >>> +//                     The LLVM Compiler Infrastructure
> >>> +//
> >>> +// This file is distributed under the University of Illinois Open
> Source
> >>> +// License. See LICENSE.TXT for details.
> >>> +//
> >>>
> >>> +//===------------------------------------------------------
> ----------------===//
> >>> +
> >>> +#ifndef SBStructuredData_h
> >>> +#define SBStructuredData_h
> >>> +
> >>> +#include "lldb/API/SBDefines.h"
> >>> +#include "lldb/API/SBModule.h"
> >>> +
> >>> +namespace lldb {
> >>> +
> >>> +    class SBStructuredData
> >>> +    {
> >>> +    public:
> >>> +
> >>> +        SBStructuredData();
> >>> +
> >>> +        SBStructuredData(const lldb::SBStructuredData &rhs);
> >>> +
> >>> +        SBStructuredData(const lldb::EventSP &event_sp);
> >>> +
> >>> +        ~SBStructuredData();
> >>> +
> >>> +        lldb::SBStructuredData &
> >>> +        operator =(const lldb::SBStructuredData &rhs);
> >>> +
> >>> +        bool
> >>> +        IsValid() const;
> >>> +
> >>> +        void
> >>> +        Clear();
> >>> +
> >>> +        lldb::SBError
> >>> +        GetAsJSON(lldb::SBStream &stream) const;
> >>> +
> >>> +        lldb::SBError
> >>> +        GetDescription(lldb::SBStream &stream) const;
> >>> +
> >>> +    private:
> >>> +
> >>> +        class Impl;
> >>> +        std::unique_ptr<Impl> m_impl_up;
> >>> +    };
> >>> +}
> >>> +
> >>> +#endif /* SBStructuredData_h */
> >>>
> >>> Modified: lldb/trunk/include/lldb/Core/Broadcaster.h
> >>> URL:
> >>> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/
> lldb/Core/Broadcaster.h?rev=279198&r1=279197&r2=279198&view=diff
> >>>
> >>> ============================================================
> ==================
> >>> --- lldb/trunk/include/lldb/Core/Broadcaster.h (original)
> >>> +++ lldb/trunk/include/lldb/Core/Broadcaster.h Thu Aug 18 21:52:07
> 2016
> >>> @@ -272,11 +272,10 @@ private:
> >>>  ///         //---------------------------
> -------------------------------
> >>>  ///         enum
> >>>  ///         {
> >>> -///             eBroadcastBitStateChanged   = (1 << 0),
> >>> -///             eBroadcastBitInterrupt      = (1 << 1),
> >>> -///             eBroadcastBitSTDOUT         = (1 << 2),
> >>> -///             eBroadcastBitSTDERR         = (1 << 3),
> >>> -///             eBroadcastBitProfileData    = (1 << 4)
> >>> +///             eBroadcastBitOne   = (1 << 0),
> >>> +///             eBroadcastBitTwo   = (1 << 1),
> >>> +///             eBroadcastBitThree = (1 << 2),
> >>> +///             ...
> >>>  ///         };
> >>>  ///     \endcode
> >>>  //----------------------------------------------------------
> ------------
> >>>
> >>> Modified: lldb/trunk/include/lldb/Core/Event.h
> >>> URL:
> >>> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/
> lldb/Core/Event.h?rev=279198&r1=279197&r2=279198&view=diff
> >>>
> >>> ============================================================
> ==================
> >>> --- lldb/trunk/include/lldb/Core/Event.h (original)
> >>> +++ lldb/trunk/include/lldb/Core/Event.h Thu Aug 18 21:52:07 2016
> >>> @@ -20,6 +20,7 @@
> >>>  // Project includes
> >>>  #include "lldb/lldb-private.h"
> >>>  #include "lldb/Core/ConstString.h"
> >>> +#include "lldb/Core/StructuredData.h"
> >>>  #include "lldb/Host/Predicate.h"
> >>>  #include "lldb/Core/Broadcaster.h"
> >>>
> >>> @@ -159,6 +160,80 @@ private:
> >>>  };
> >>>
> >>>  //----------------------------------------------------------
> ------------
> >>> +/// This class handles one or more StructuredData::Dictionary entries
> >>> +/// that are raised for structured data events.
> >>> +//---------------------------------------------------------
> -------------
> >>> +
> >>> +class EventDataStructuredData : public EventData
> >>> +{
> >>> +public:
> >>> +
> >>> +    //----------------------------------------------------------
> --------
> >>> +    // Constructors
> >>> +    //----------------------------------------------------------
> --------
> >>> +    EventDataStructuredData();
> >>> +
> >>> +    EventDataStructuredData(const lldb::ProcessSP &process_sp,
> >>> +                            const StructuredData::ObjectSP &object_sp,
> >>> +                            const lldb::StructuredDataPluginSP
> >>> &plugin_sp);
> >>> +
> >>> +    ~EventDataStructuredData() override;
> >>> +
> >>> +    //----------------------------------------------------------
> --------
> >>> +    // Member functions
> >>> +    //----------------------------------------------------------
> --------
> >>> +    const ConstString &
> >>> +    GetFlavor() const override;
> >>> +
> >>> +    void
> >>> +    Dump(Stream *s) const override;
> >>> +
> >>> +    const lldb::ProcessSP&
> >>> +    GetProcess() const;
> >>> +
> >>> +    const StructuredData::ObjectSP&
> >>> +    GetObject() const;
> >>> +
> >>> +    const lldb::StructuredDataPluginSP&
> >>> +    GetStructuredDataPlugin() const;
> >>> +
> >>> +    void
> >>> +    SetProcess(const lldb::ProcessSP &process_sp);
> >>> +
> >>> +    void
> >>> +    SetObject(const StructuredData::ObjectSP &object_sp);
> >>> +
> >>> +    void
> >>> +    SetStructuredDataPlugin(const lldb::StructuredDataPluginSP
> >>> &plugin_sp);
> >>> +
> >>> +    //----------------------------------------------------------
> --------
> >>> +    // Static functions
> >>> +    //----------------------------------------------------------
> --------
> >>> +    static const EventDataStructuredData*
> >>> +    GetEventDataFromEvent(const Event *event_ptr);
> >>> +
> >>> +    static lldb::ProcessSP
> >>> +    GetProcessFromEvent(const Event *event_ptr);
> >>> +
> >>> +    static StructuredData::ObjectSP
> >>> +    GetObjectFromEvent(const Event *event_ptr);
> >>> +
> >>> +    static lldb::StructuredDataPluginSP
> >>> +    GetPluginFromEvent(const Event *event_ptr);
> >>> +
> >>> +    static const ConstString &
> >>> +    GetFlavorString ();
> >>> +
> >>> +private:
> >>> +
> >>> +    lldb::ProcessSP               m_process_sp;
> >>> +    StructuredData::ObjectSP      m_object_sp;
> >>> +    lldb::StructuredDataPluginSP  m_plugin_sp;
> >>> +
> >>> +    DISALLOW_COPY_AND_ASSIGN(EventDataStructuredData);
> >>> +};
> >>> +
> >>> +//---------------------------------------------------------
> -------------
> >>>  // lldb::Event
> >>>  //----------------------------------------------------------
> ------------
> >>>  class Event
> >>>
> >>> Modified: lldb/trunk/include/lldb/Core/PluginManager.h
> >>> URL:
> >>> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/
> lldb/Core/PluginManager.h?rev=279198&r1=279197&r2=279198&view=diff
> >>>
> >>> ============================================================
> ==================
> >>> --- lldb/trunk/include/lldb/Core/PluginManager.h (original)
> >>> +++ lldb/trunk/include/lldb/Core/PluginManager.h Thu Aug 18 21:52:07
> 2016
> >>> @@ -328,6 +328,65 @@ public:
> >>>                                      CommandInterpreter &interpreter);
> >>>
> >>>      //----------------------------------------------------------
> --------
> >>> +    // StructuredDataPlugin
> >>> +    //----------------------------------------------------------
> --------
> >>> +
> >>> +    //----------------------------------------------------------
> --------
> >>> +    /// Register a StructuredDataPlugin class along with optional
> >>> +    /// callbacks for debugger initialization and Process launch info
> >>> +    /// filtering and manipulation.
> >>> +    ///
> >>> +    /// @param[in] name
> >>> +    ///    The name of the plugin.
> >>> +    ///
> >>> +    /// @param[in] description
> >>> +    ///    A description string for the plugin.
> >>> +    ///
> >>> +    /// @param[in] create_callback
> >>> +    ///    The callback that will be invoked to create an instance of
> >>> +    ///    the callback.  This may not be nullptr.
> >>> +    ///
> >>> +    /// @param[in] debugger_init_callback
> >>> +    ///    An optional callback that will be made when a Debugger
> >>> +    ///    instance is initialized.
> >>> +    ///
> >>> +    /// @param[in] filter_callback
> >>> +    ///    An optional callback that will be invoked before LLDB
> >>> +    ///    launches a process for debugging.  The callback must
> >>> +    ///    do the following:
> >>> +    ///    1. Only do something if the plugin's behavior is enabled.
> >>> +    ///    2. Only make changes for processes that are relevant to the
> >>> +    ///       plugin.  The callback gets a pointer to the Target,
> which
> >>> +    ///       can be inspected as needed.  The ProcessLaunchInfo is
> >>> +    ///       provided in read-write mode, and may be modified by the
> >>> +    ///       plugin if, for instance, additional environment
> variables
> >>> +    ///       are needed to support the feature when enabled.
> >>> +    ///
> >>> +    /// @return
> >>> +    ///    Returns true upon success; otherwise, false.
> >>> +    //----------------------------------------------------------
> --------
> >>> +    static bool
> >>> +    RegisterPlugin(const ConstString &name,
> >>> +                   const char *description,
> >>> +                   StructuredDataPluginCreateInstance
> create_callback,
> >>> +                   DebuggerInitializeCallback debugger_init_callback =
> >>> nullptr,
> >>> +                   StructuredDataFilterLaunchInfo filter_callback
> >>> +                   = nullptr);
> >>> +
> >>> +    static bool
> >>> +    UnregisterPlugin(StructuredDataPluginCreateInstance
> >>> create_callback);
> >>> +
> >>> +    static StructuredDataPluginCreateInstance
> >>> +    GetStructuredDataPluginCreateCallbackAtIndex(uint32_t idx);
> >>> +
> >>> +    static StructuredDataPluginCreateInstance
> >>> +    GetStructuredDataPluginCreateCallbackForPluginName(const
> ConstString
> >>> &name);
> >>> +
> >>> +    static StructuredDataFilterLaunchInfo
> >>> +    GetStructuredDataFilterCallbackAtIndex(uint32_t idx,
> >>> +                                           bool &iteration_complete);
> >>> +
> >>> +    //----------------------------------------------------------
> --------
> >>>      // SymbolFile
> >>>      //----------------------------------------------------------
> --------
> >>>      static bool
> >>> @@ -531,6 +590,16 @@ public:
> >>>      static bool CreateSettingForOperatingSystemPlugin(Debugger
> >>> &debugger,
> >>>                                                        const
> >>> lldb::OptionValuePropertiesSP &properties_sp,
> >>>                                                        const
> ConstString
> >>> &description, bool is_global_property);
> >>> +
> >>> +    static lldb::OptionValuePropertiesSP
> >>> +    GetSettingForStructuredDataPlugin(Debugger &debugger,
> >>> +                                      const ConstString
> &setting_name);
> >>> +
> >>> +    static bool
> >>> +    CreateSettingForStructuredDataPlugin(Debugger &debugger,
> >>> +                                         const
> >>> lldb::OptionValuePropertiesSP &properties_sp,
> >>> +                                         const ConstString
> &description,
> >>> +                                         bool is_global_property);
> >>>  };
> >>>
> >>>  } // namespace lldb_private
> >>>
> >>> Modified: lldb/trunk/include/lldb/Interpreter/Args.h
> >>> URL:
> >>> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/
> lldb/Interpreter/Args.h?rev=279198&r1=279197&r2=279198&view=diff
> >>>
> >>> ============================================================
> ==================
> >>> --- lldb/trunk/include/lldb/Interpreter/Args.h (original)
> >>> +++ lldb/trunk/include/lldb/Interpreter/Args.h Thu Aug 18 21:52:07
> 2016
> >>> @@ -451,6 +451,17 @@ public:
> >>>      LongestCommonPrefix (std::string &common_prefix);
> >>>
> >>>      //----------------------------------------------------------
> --------
> >>> +    /// Add or replace an environment variable with the given value.
> >>> +    ///
> >>> +    /// This command adds the environment variable if it is not
> already
> >>> +    /// present using the given value.  If the environment variable is
> >>> +    /// already in the list, it replaces the first such occurrence
> >>> +    /// with the new value.
> >>> +    //----------------------------------------------------------
> --------
> >>> +    void
> >>> +    AddOrReplaceEnvironmentVariable(const char *env_var_name,
> >>> +                                    const char *new_value);
> >>> +
> >>>      /// Return whether a given environment variable exists.
> >>>      ///
> >>>      /// This command treats Args like a list of environment variables,
> >>> @@ -460,12 +471,18 @@ public:
> >>>      /// @param[in] env_var_name
> >>>      ///     Specifies the name of the environment variable to check.
> >>>      ///
> >>> +    /// @param[out] argument_index
> >>> +    ///     If non-null, then when the environment variable is found,
> >>> +    ///     the index of the argument position will be returned in
> >>> +    ///     the size_t pointed to by this argument.
> >>> +    ///
> >>>      /// @return
> >>>      ///     true if the specified env var name exists in the list in
> >>>      ///     either of the above-mentioned formats; otherwise, false.
> >>>      //----------------------------------------------------------
> --------
> >>>      bool
> >>> -    ContainsEnvironmentVariable(const char *env_var_name) const;
> >>> +    ContainsEnvironmentVariable(const char *env_var_name,
> >>> +                                size_t *argument_index = nullptr)
> const;
> >>>
> >>>  protected:
> >>>      //----------------------------------------------------------
> --------
> >>>
> >>> Modified: lldb/trunk/include/lldb/Target/Process.h
> >>> URL:
> >>> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/
> lldb/Target/Process.h?rev=279198&r1=279197&r2=279198&view=diff
> >>>
> >>> ============================================================
> ==================
> >>> --- lldb/trunk/include/lldb/Target/Process.h (original)
> >>> +++ lldb/trunk/include/lldb/Target/Process.h Thu Aug 18 21:52:07 2016
> >>> @@ -760,7 +760,8 @@ public:
> >>>          eBroadcastBitInterrupt      = (1 << 1),
> >>>          eBroadcastBitSTDOUT         = (1 << 2),
> >>>          eBroadcastBitSTDERR         = (1 << 3),
> >>> -        eBroadcastBitProfileData    = (1 << 4)
> >>> +        eBroadcastBitProfileData    = (1 << 4),
> >>> +        eBroadcastBitStructuredData = (1 << 5),
> >>>      };
> >>>
> >>>      enum
> >>> @@ -3254,6 +3255,71 @@ public:
> >>>      AdvanceAddressToNextBranchInstruction (Address default_stop_addr,
> >>>                                             AddressRange range_bounds);
> >>>
> >>> +    //----------------------------------------------------------
> --------
> >>> +    /// Configure asynchronous structured data feature.
> >>> +    ///
> >>> +    /// Each Process type that supports using an asynchronous
> >>> StructuredData
> >>> +    /// feature should implement this to enable/disable/configure the
> >>> feature.
> >>> +    /// The default implementation here will always return an error
> >>> indiciating
> >>> +    /// the feature is unsupported.
> >>> +    ///
> >>> +    /// StructuredDataPlugin implementations will call this to
> configure
> >>> +    /// a feature that has been reported as being supported.
> >>> +    ///
> >>> +    /// @param[in] type_name
> >>> +    ///     The StructuredData type name as previously discovered by
> >>> +    ///     the Process-derived instance.
> >>> +    ///
> >>> +    /// @param[in] config
> >>> +    ///     Configuration data for the feature being enabled.  This
> >>> config
> >>> +    ///     data, which may be null, will be passed along to the
> feature
> >>> +    ///     to process.  The feature will dictate whether this is a
> >>> dictionary,
> >>> +    ///     an array or some other object.  If the feature needs to be
> >>> +    ///     set up properly before it can be enabled, then the config
> >>> should
> >>> +    ///     also take an enable/disable flag.
> >>> +    ///
> >>> +    /// @return
> >>> +    ///     Returns the result of attempting to configure the feature.
> >>> +    //----------------------------------------------------------
> --------
> >>> +    virtual Error
> >>> +    ConfigureStructuredData(const ConstString &type_name,
> >>> +                            const StructuredData::ObjectSP
> &config_sp);
> >>> +
> >>> +    //----------------------------------------------------------
> --------
> >>> +    /// Broadcasts the given structured data object from the given
> >>> +    /// plugin.
> >>> +    ///
> >>> +    /// StructuredDataPlugin instances can use this to optionally
> >>> +    /// broadcast any of their data if they want to make it available
> >>> +    /// for clients.  The data will come in on the structured data
> >>> +    /// event bit (eBroadcastBitStructuredData).
> >>> +    ///
> >>> +    /// @param[in] object_sp
> >>> +    ///     The structured data object to broadcast.
> >>> +    ///
> >>> +    /// @param[in] plugin_sp
> >>> +    ///     The plugin that will be reported in the event's plugin
> >>> +    ///     parameter.
> >>> +    //----------------------------------------------------------
> --------
> >>> +    void
> >>> +    BroadcastStructuredData(const StructuredData::ObjectSP &object_sp,
> >>> +                            const lldb::StructuredDataPluginSP
> >>> &plugin_sp);
> >>> +
> >>> +    //----------------------------------------------------------
> --------
> >>> +    /// Returns the StructuredDataPlugin associated with a given type
> >>> +    /// name, if there is one.
> >>> +    ///
> >>> +    /// There will only be a plugin for a given StructuredDataType if
> >>> the
> >>> +    /// debugged process monitor claims that the feature is supported.
> >>> +    /// This is one way to tell whether a feature is available.
> >>> +    ///
> >>> +    /// @return
> >>> +    ///     The plugin if one is available for the specified feature;
> >>> +    ///     otherwise, returns an empty shared pointer.
> >>> +    //----------------------------------------------------------
> --------
> >>> +    lldb::StructuredDataPluginSP
> >>> +    GetStructuredDataPlugin(const ConstString &type_name) const;
> >>> +
> >>>  protected:
> >>>      void
> >>>      SetState (lldb::EventSP &event_sp);
> >>> @@ -3392,6 +3458,57 @@ protected:
> >>>      }
> >>>
> >>>      //----------------------------------------------------------
> --------
> >>> +    /// Loads any plugins associated with asynchronous structured data
> >>> +    /// and maps the relevant supported type name to the plugin.
> >>> +    ///
> >>> +    /// Processes can receive asynchronous structured data from the
> >>> +    /// process monitor.  This method will load and map any structured
> >>> +    /// data plugins that support the given set of supported type
> names.
> >>> +    /// Later, if any of these features are enabled, the process
> monitor
> >>> +    /// is free to generate asynchronous structured data.  The data
> must
> >>> +    /// come in as a single \b StructuredData::Dictionary.  That
> >>> dictionary
> >>> +    /// must have a string field named 'type', with a value that
> equals
> >>> +    /// the relevant type name string (one of the values in
> >>> +    /// \b supported_type_names).
> >>> +    ///
> >>> +    /// @param[in] supported_type_names
> >>> +    ///     An array of zero or more type names.  Each must be unique.
> >>> +    ///     For each entry in the list, a StructuredDataPlugin will be
> >>> +    ///     searched for that supports the structured data type name.
> >>> +    //----------------------------------------------------------
> --------
> >>> +    void
> >>> +    MapSupportedStructuredDataPlugins(const StructuredData::Array
> >>> +                                           &supported_type_names);
> >>> +
> >>> +    //----------------------------------------------------------
> --------
> >>> +    /// Route the incoming structured data dictionary to the right
> >>> plugin.
> >>> +    ///
> >>> +    /// The incoming structured data must be a dictionary, and it must
> >>> +    /// have a key named 'type' that stores a string value.  The
> string
> >>> +    /// value must be the name of the structured data feature that
> >>> +    /// knows how to handle it.
> >>> +    ///
> >>> +    /// @param[in] object_sp
> >>> +    ///     When non-null and pointing to a dictionary, the 'type'
> >>> +    ///     key's string value is used to look up the plugin that
> >>> +    ///     was registered for that structured data type.  It then
> >>> +    ///     calls the following method on the StructuredDataPlugin
> >>> +    ///     instance:
> >>> +    ///
> >>> +    ///     virtual void
> >>> +    ///     HandleArrivalOfStructuredData(Process &process,
> >>> +    ///                                   const ConstString
> &type_name,
> >>> +    ///                                   const
> StructuredData::ObjectSP
> >>> +    ///                                   &object_sp)
> >>> +    ///
> >>> +    /// @return
> >>> +    ///     True if the structured data was routed to a plugin;
> >>> otherwise,
> >>> +    ///     false.
> >>> +    //----------------------------------------------------------
> --------
> >>> +    bool
> >>> +    RouteAsyncStructuredData(const StructuredData::ObjectSP
> object_sp);
> >>> +
> >>> +    //----------------------------------------------------------
> --------
> >>>      // Type definitions
> >>>      //----------------------------------------------------------
> --------
> >>>      typedef std::map<lldb::LanguageType, lldb::LanguageRuntimeSP>
> >>> LanguageRuntimeCollection;
> >>> @@ -3408,6 +3525,9 @@ protected:
> >>>          {
> >>>          }
> >>>      };
> >>> +
> >>> +    using StructuredDataPluginMap = std::map<ConstString,
> >>> +
> >>> lldb::StructuredDataPluginSP>;
> >>>
> >>>      //----------------------------------------------------------
> --------
> >>>      // Member variables
> >>> @@ -3477,7 +3597,9 @@ protected:
> >>>      bool m_can_interpret_function_calls; // Some targets, e.g the OSX
> >>> kernel, don't support the ability to modify the stack.
> >>>      WarningsCollection          m_warnings_issued;  // A set of object
> >>> pointers which have already had warnings printed
> >>>      std::mutex                  m_run_thread_plan_lock;
> >>> -
> >>> +    StructuredDataPluginMap     m_structured_data_plugin_map;
> >>> +
> >>> +
> >>>      enum {
> >>>          eCanJITDontKnow= 0,
> >>>          eCanJITYes,
> >>> @@ -3562,7 +3684,7 @@ protected:
> >>>
> >>>      void
> >>>      BroadcastAsyncProfileData(const std::string &one_profile_data);
> >>> -
> >>> +
> >>>      static void
> >>>      STDIOReadThreadBytesReceived (void *baton, const void *src, size_t
> >>> src_len);
> >>>
> >>>
> >>> Added: lldb/trunk/include/lldb/Target/StructuredDataPlugin.h
> >>> URL:
> >>> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/
> StructuredDataPlugin.h?rev=279198&view=auto
> >>>
> >>> ============================================================
> ==================
> >>> --- lldb/trunk/include/lldb/Target/StructuredDataPlugin.h (added)
> >>> +++ lldb/trunk/include/lldb/Target/StructuredDataPlugin.h Thu Aug 18
> >>> 21:52:07 2016
> >>> @@ -0,0 +1,204 @@
> >>> +//===-- StructuredDataPlugin.h ----------------------------------*-
> C++
> >>> -*-===//
> >>> +//
> >>> +//                     The LLVM Compiler Infrastructure
> >>> +//
> >>> +// This file is distributed under the University of Illinois Open
> Source
> >>> +// License. See LICENSE.TXT for details.
> >>> +//
> >>>
> >>> +//===------------------------------------------------------
> ----------------===//
> >>> +
> >>> +#ifndef StructuredDataPlugin_h
> >>> +#define StructuredDataPlugin_h
> >>> +
> >>> +#include "lldb/Core/PluginInterface.h"
> >>> +#include "lldb/Core/StructuredData.h"
> >>> +
> >>> +namespace lldb_private
> >>> +{
> >>> +
> >>> +class CommandObjectMultiword;
> >>> +
> >>> +//
> >>> ------------------------------------------------------------
> -----------------
> >>> +/// Plugin that supports process-related structured data sent
> >>> asynchronously
> >>> +/// from the debug monitor (e.g. debugserver, lldb-server, etc.)
> >>> +///
> >>> +/// This plugin type is activated by a Process-derived instance when
> >>> that
> >>> +/// instance detects that a given structured data feature is
> available.
> >>> +///
> >>> +/// StructuredDataPlugin instances are inherently tied to a process.
> >>> The
> >>> +/// main functionality they support is the ability to consume
> >>> asynchronously-
> >>> +/// delivered structured data from the process monitor, and do
> something
> >>> +/// reasonable with it.  Something reasonable can include
> broadcasting a
> >>> +/// StructuredData event, which other parts of the system can then do
> >>> with
> >>> +/// as they please.  An IDE could use this facility to retrieve CPU
> >>> usage,
> >>> +/// memory usage, and other run-time aspects of the process.  That
> data
> >>> +/// can then be displayed meaningfully to the user through the IDE.
> >>> +
> >>> +/// For command-line LLDB, the Debugger instance listens for the
> >>> structured
> >>> +/// data events raised by the plugin, and give the plugin both the
> >>> output
> >>> +/// and error streams such that the plugin can display something about
> >>> the
> >>> +/// event, at a time when the debugger ensures it is safe to write to
> >>> the
> >>> +/// output or error streams.
> >>> +//
> >>> ------------------------------------------------------------
> -----------------
> >>> +
> >>> +class StructuredDataPlugin :
> >>> +    public PluginInterface,
> >>> +    public std::enable_shared_from_this<StructuredDataPlugin>
> >>> +{
> >>> +public:
> >>> +
> >>> +    virtual ~StructuredDataPlugin();
> >>> +
> >>> +    lldb::ProcessSP
> >>> +    GetProcess() const;
> >>> +
> >>> +    //
> >>> ------------------------------------------------------------
> -------------
> >>> +    // Public instance API
> >>> +    //
> >>> ------------------------------------------------------------
> -------------
> >>> +
> >>> +    //
> >>> ------------------------------------------------------------
> -------------
> >>> +    /// Return whether this plugin supports the given StructuredData
> >>> feature.
> >>> +    ///
> >>> +    /// When Process is informed of a list of
> process-monitor-supported
> >>> +    /// structured data features, Process will go through the list of
> >>> plugins,
> >>> +    /// one at a time, and have the first plugin that supports a given
> >>> feature
> >>> +    /// be the plugin instantiated to handle that feature.  There is a
> >>> 1-1
> >>> +    /// correspondence between a Process instance and a
> >>> StructuredDataPlugin
> >>> +    /// mapped to that process.  A plugin can support handling
> multiple
> >>> +    /// features, and if that happens, there is a single plugin
> instance
> >>> +    /// created covering all of the mapped features for a given
> process.
> >>> +    ///
> >>> +    /// @param[in] type_name
> >>> +    ///     The name of the feature tag supported by a process.
> >>> +    ///     e.g. "darwin-log".
> >>> +    ///
> >>> +    /// @return
> >>> +    ///     true if the plugin supports the feature; otherwise, false.
> >>> +    //
> >>> ------------------------------------------------------------
> -------------
> >>> +    virtual bool
> >>> +    SupportsStructuredDataType(const ConstString &type_name) = 0;
> >>> +
> >>> +    //
> >>> ------------------------------------------------------------
> -------------
> >>> +    /// Handle the arrival of asynchronous structured data from the
> >>> process.
> >>> +    ///
> >>> +    /// When asynchronous structured data arrives from the process
> >>> monitor,
> >>> +    /// it is immediately delivered to the plugin mapped for that
> >>> feature
> >>> +    /// if one exists.  The structured data that arrives from a
> process
> >>> +    /// monitor must be a dictionary, and it must have a string field
> >>> named
> >>> +    /// "type" that must contain the StructuredData feature name set
> as
> >>> the
> >>> +    /// value.  This is the manner in which the data is routed to the
> >>> proper
> >>> +    /// plugin instance.
> >>> +    ///
> >>> +    /// @param[in] process
> >>> +    ///     The process instance that just received the structured
> data.
> >>> +    ///     This will always be the same process for a given instance
> of
> >>> +    ///     a plugin.
> >>> +    ///
> >>> +    /// @param[in] type_name
> >>> +    ///     The name of the feature tag for the asynchronous
> structured
> >>> data.
> >>> +    ///     Note this data will also be present in the \b object_sp
> >>> dictionary
> >>> +    ///     under the string value with key "type".
> >>> +    ///
> >>> +    /// @param[in] object_sp
> >>> +    ///     A shared pointer to the structured data that arrived.
> This
> >>> must
> >>> +    ///> _______________________________________________
> > lldb-commits mailing list
> > lldb-commits at lists.llvm.org <javascript:;>
> > http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
> >
>


-- 
-Todd
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20160819/f1269e1e/attachment-0001.html>


More information about the lldb-commits mailing list