[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 09:22:04 PDT 2016
That is indeed what happened. On July 18th, 2016, Kate created a
reviews.llvm.org entity called LLDB, which is a group that anyone can join
(see link below):
https://reviews.llvm.org/project/profile/39/
Up until moments ago, she was the only member of the group. (I just added
myself).
And I see how that would truncate the auto completion of lldb-commits.
-Todd
On Fri, Aug 19, 2016 at 8:56 AM, Todd Fiala <todd.fiala at gmail.com> wrote:
> 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/TestDarwinLogFi
>> lterMatchActivityChain.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/TestDarwinLogFilterMa
>> tchActivity.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/TestDarwinLogFilterMa
>> tchCategory.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/TestDarwinLogFilterM
>> atchSubsystem.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/TestDarwinLogFi
>> lterRegexActivityChain.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/Structure
>> dDataDarwinLog.cpp
>> >>>
>> >>> lldb/trunk/source/Plugins/StructuredData/DarwinLog/Structure
>> dDataDarwinLog.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/Activit
>> yStore.cpp
>> >>> lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/Activi
>> tyStore.h
>> >>>
>> >>> lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/Activit
>> yStreamSPI.h
>> >>> lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/CMakeL
>> ists.txt
>> >>>
>> >>> lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/DarwinL
>> ogCollector.cpp
>> >>>
>> >>> lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/DarwinL
>> ogCollector.h
>> >>> lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/Darwin
>> LogEvent.h
>> >>>
>> >>> lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/DarwinL
>> ogInterfaces.h
>> >>> lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/Darwin
>> LogTypes.h
>> >>> lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/LogFil
>> ter.cpp
>> >>> lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/LogFilter.h
>> >>>
>> >>> lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/LogFilt
>> erChain.cpp
>> >>> lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/LogFil
>> terChain.h
>> >>>
>> >>> lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/LogFilt
>> erExactMatch.cpp
>> >>>
>> >>> lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/LogFilt
>> erExactMatch.h
>> >>>
>> >>> lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/LogFilt
>> erRegex.cpp
>> >>> lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/LogFil
>> terRegex.h
>> >>> lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/LogMes
>> sage.cpp
>> >>> lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/LogMessage.h
>> >>>
>> >>> lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/LogMess
>> ageOsLog.cpp
>> >>>
>> >>> lldb/trunk/tools/debugserver/source/MacOSX/DarwinLog/LogMess
>> ageOsLog.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/GDBRemoteClien
>> tBase.cpp
>> >>> lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteClien
>> tBase.h
>> >>>
>> >>> lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommun
>> icationClient.cpp
>> >>>
>> >>> lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommun
>> icationClient.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?re
>> v=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/LLDBDep
>> endencies.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/structur
>> ed_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/structur
>> ed_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
>> > http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
>> >
>>
>
>
> --
> -Todd
>
>
--
-Todd
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20160819/dafa7f71/attachment-0001.html>
More information about the lldb-commits
mailing list