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@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 <ztur...@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@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 >>> + /// be a dictionary. The only key required is the >>> aforementioned >>> + /// key named "type" that must be a string value containing the >>> + /// structured data type name. >>> + // >>> ------------------------------------------------------------------------- >>> + virtual void >>> + HandleArrivalOfStructuredData(Process &process, >>> + const ConstString &type_name, >>> + const StructuredData::ObjectSP >>> + &object_sp) = 0; >>> + >>> + >>> + // >>> ------------------------------------------------------------------------- >>> + /// Get a human-readable description of the contents of the data. >>> + /// >>> + /// In command-line LLDB, this method will be called by the Debugger >>> + /// instance for each structured data event generated, and the >>> output >>> + /// will be printed to the LLDB console. If nothing is added to the >>> stream, >>> + /// nothing will be printed; otherwise, a newline will be added to >>> the end >>> + /// when displayed. >>> + /// >>> + /// @param[in] object_sp >>> + /// A shared pointer to the structured data to format. >>> + /// >>> + /// @param[in] stream >>> + /// The stream where the structured data should be pretty >>> printed. >>> + /// >>> + /// @return >>> + /// The error if formatting the object contents failed; >>> otherwise, >>> + /// success. >>> + // >>> ------------------------------------------------------------------------- >>> + virtual Error >>> + GetDescription(const StructuredData::ObjectSP &object_sp, >>> + lldb_private::Stream &stream) = 0; >>> + >>> + // >>> ------------------------------------------------------------------------- >>> + /// Returns whether the plugin's features are enabled. >>> + /// >>> + /// This is a convenience method for plugins that can enable or >>> disable >>> + /// their functionality. It allows retrieval of this state without >>> + /// requiring a cast. >>> + /// >>> + /// @param[in] type_name >>> + /// The name of the feature tag for the asynchronous structured >>> data. >>> + /// This is needed for plugins that support more than one >>> feature. >>> + // >>> ------------------------------------------------------------------------- >>> + virtual bool >>> + GetEnabled(const ConstString &type_name) const; >>> + >>> + // >>> ------------------------------------------------------------------------- >>> + /// Allow the plugin to do work related to modules that loaded in >>> the >>> + /// the corresponding process. >>> + /// >>> + /// This method defaults to doing nothing. Plugins can override it >>> + /// if they have any behavior they want to enable/modify based on >>> loaded >>> + /// modules. >>> + /// >>> + /// @param[in] process >>> + /// The process that just was notified of modules having been >>> loaded. >>> + /// This will always be the same process for a given instance of >>> + /// a plugin. >>> + /// >>> + /// @param[in] module_list >>> + /// The list of modules that the process registered as having >>> just >>> + /// loaded. See \b Process::ModulesDidLoad(...). >>> + // >>> ------------------------------------------------------------------------- >>> + virtual void >>> + ModulesDidLoad(Process &process, ModuleList &module_list); >>> + >>> +protected: >>> + >>> + // >>> ------------------------------------------------------------------------- >>> + // Derived-class API >>> + // >>> ------------------------------------------------------------------------- >>> + StructuredDataPlugin(const lldb::ProcessWP &process_wp); >>> + >>> + // >>> ------------------------------------------------------------------------- >>> + /// Derived classes must call this before attempting to hook up >>> commands >>> + /// to the 'plugin structured-data' tree. >>> + /// >>> + /// This ensures the relevant command and options hook points for >>> all >>> + /// StructuredDataPlugin derived classes are available for this >>> debugger. >>> + /// If this has already happened, this call is a no-op. >>> + /// >>> + /// @param[in] debugger >>> + /// The Debugger instance for which we're creating the required >>> shared >>> + /// components for the StructuredDataPlugin derived classes. >>> + // >>> ------------------------------------------------------------------------- >>> + static void >>> + InitializeBasePluginForDebugger(Debugger &debugger); >>> + >>> +private: >>> + >>> + lldb::ProcessWP m_process_wp; >>> + >>> + DISALLOW_COPY_AND_ASSIGN(StructuredDataPlugin); >>> + >>> +}; >>> + >>> +} >>> + >>> +#endif >>> >>> Added: lldb/trunk/include/lldb/Target/ThreadPlanCallOnFunctionExit.h >>> URL: >>> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/ThreadPlanCallOnFunctionExit.h?rev=279198&view=auto >>> >>> ============================================================================== >>> --- lldb/trunk/include/lldb/Target/ThreadPlanCallOnFunctionExit.h (added) >>> +++ lldb/trunk/include/lldb/Target/ThreadPlanCallOnFunctionExit.h Thu Aug >>> 18 21:52:07 2016 >>> @@ -0,0 +1,69 @@ >>> +//===-- ThreadPlanCallOnFunctionExit.h --------------------------*- C++ >>> -*-===// >>> +// >>> +// The LLVM Compiler Infrastructure >>> +// >>> +// This file is distributed under the University of Illinois Open Source >>> +// License. See LICENSE.TXT for details. >>> +// >>> >>> +//===----------------------------------------------------------------------===// >>> + >>> +#ifndef ThreadPlanCallOnFunctionExit_h >>> +#define ThreadPlanCallOnFunctionExit_h >>> + >>> +#include "lldb/Target/ThreadPlan.h" >>> + >>> +#include <functional> >>> + >>> +namespace lldb_private { >>> + >>> +// >>> ============================================================================= >>> +/// This thread plan calls a function object when the current function >>> exits. >>> +// >>> ============================================================================= >>> + >>> +class ThreadPlanCallOnFunctionExit : public ThreadPlan >>> +{ >>> +public: >>> + >>> + /// Definition for the callback made when the currently executing >>> thread >>> + /// finishes executing its function. >>> + using Callback = std::function<void()>; >>> + >>> + ThreadPlanCallOnFunctionExit(Thread &thread, const Callback >>> &callback); >>> + >>> + void >>> + DidPush() override; >>> + >>> + // >>> ------------------------------------------------------------------------- >>> + // ThreadPlan API >>> + // >>> ------------------------------------------------------------------------- >>> + >>> + void >>> + GetDescription (Stream *s, lldb::DescriptionLevel level) override; >>> + >>> + bool >>> + ValidatePlan (Stream *error) override; >>> + >>> + bool >>> + ShouldStop (Event *event_ptr) override; >>> + >>> + bool >>> + WillStop () override; >>> + >>> +protected: >>> + >>> + bool >>> + DoPlanExplainsStop (Event *event_ptr) override; >>> + >>> + lldb::StateType >>> + GetPlanRunState () override; >>> + >>> +private: >>> + >>> + Callback m_callback; >>> + lldb::ThreadPlanSP m_step_out_threadplan_sp; >>> + >>> +}; >>> + >>> +} >>> + >>> +#endif /* ThreadPlanCallOnFunctionExit_h */ >>> >>> Modified: lldb/trunk/include/lldb/lldb-forward.h >>> URL: >>> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/lldb-forward.h?rev=279198&r1=279197&r2=279198&view=diff >>> >>> ============================================================================== >>> --- lldb/trunk/include/lldb/lldb-forward.h (original) >>> +++ lldb/trunk/include/lldb/lldb-forward.h Thu Aug 18 21:52:07 2016 >>> @@ -91,6 +91,7 @@ class Error; >>> class EvaluateExpressionOptions; >>> class Event; >>> class EventData; >>> +class EventDataStructuredData; >>> class ExecutionContext; >>> class ExecutionContextRef; >>> class ExecutionContextRefLocker; >>> @@ -215,6 +216,7 @@ class StreamFile; >>> class StreamString; >>> class StringList; >>> struct StringSummaryFormat; >>> +class StructuredDataPlugin; >>> class SystemRuntime; >>> class TypeSummaryImpl; >>> class TypeSummaryOptions; >>> @@ -333,6 +335,7 @@ namespace lldb { >>> typedef std::unique_ptr<lldb_private::DynamicLoader> >>> DynamicLoaderUP; >>> typedef std::shared_ptr<lldb_private::Event> EventSP; >>> typedef std::shared_ptr<lldb_private::EventData> EventDataSP; >>> + typedef std::shared_ptr<lldb_private::EventDataStructuredData> >>> EventDataStructuredDataSP; >>> typedef std::shared_ptr<lldb_private::ExecutionContextRef> >>> ExecutionContextRefSP; >>> typedef std::shared_ptr<lldb_private::ExpressionVariable> >>> ExpressionVariableSP; >>> typedef std::shared_ptr<lldb_private::File> FileSP; >>> @@ -415,6 +418,10 @@ namespace lldb { >>> typedef std::weak_ptr<lldb_private::Stream> StreamWP; >>> typedef std::shared_ptr<lldb_private::StreamFile> StreamFileSP; >>> typedef std::shared_ptr<lldb_private::StringSummaryFormat> >>> StringTypeSummaryImplSP; >>> + typedef std::shared_ptr<lldb_private::StructuredDataPlugin> >>> + StructuredDataPluginSP; >>> + typedef std::weak_ptr<lldb_private::StructuredDataPlugin> >>> + StructuredDataPluginWP; >>> typedef std::shared_ptr<lldb_private::SymbolFile> SymbolFileSP; >>> typedef std::shared_ptr<lldb_private::SymbolFileType> >>> SymbolFileTypeSP; >>> typedef std::weak_ptr<lldb_private::SymbolFileType> >>> SymbolFileTypeWP; >>> >>> Modified: lldb/trunk/include/lldb/lldb-private-interfaces.h >>> URL: >>> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/lldb-private-interfaces.h?rev=279198&r1=279197&r2=279198&view=diff >>> >>> ============================================================================== >>> --- lldb/trunk/include/lldb/lldb-private-interfaces.h (original) >>> +++ lldb/trunk/include/lldb/lldb-private-interfaces.h Thu Aug 18 21:52:07 >>> 2016 >>> @@ -35,6 +35,9 @@ namespace lldb_private >>> typedef Language *(*LanguageCreateInstance) (lldb::LanguageType >>> language); >>> typedef LanguageRuntime *(*LanguageRuntimeCreateInstance) (Process >>> *process, lldb::LanguageType language); >>> typedef lldb::CommandObjectSP (*LanguageRuntimeGetCommandObject) >>> (CommandInterpreter& interpreter); >>> + typedef lldb::StructuredDataPluginSP >>> (*StructuredDataPluginCreateInstance) >>> + (Process &process); >>> + typedef Error (*StructuredDataFilterLaunchInfo)(ProcessLaunchInfo >>> &launch_info, Target *target); >>> typedef SystemRuntime *(*SystemRuntimeCreateInstance) (Process >>> *process); >>> typedef lldb::PlatformSP (*PlatformCreateInstance) (bool force, >>> const ArchSpec *arch); >>> typedef lldb::ProcessSP (*ProcessCreateInstance) (lldb::TargetSP >>> target_sp, lldb::ListenerSP listener_sp, const FileSpec *crash_file_path); >>> >>> Modified: lldb/trunk/lldb.xcodeproj/project.pbxproj >>> URL: >>> http://llvm.org/viewvc/llvm-project/lldb/trunk/lldb.xcodeproj/project.pbxproj?rev=279198&r1=279197&r2=279198&view=diff >>> >>> ============================================================================== >>> --- lldb/trunk/lldb.xcodeproj/project.pbxproj (original) >>> +++ lldb/trunk/lldb.xcodeproj/project.pbxproj Thu Aug 18 21:52:07 2016 >>> @@ -57,6 +57,8 @@ >>> 23059A0719532B96007B8189 /* LinuxSignals.cpp in Sources >>> */ = {isa = PBXBuildFile; fileRef = 23059A0519532B96007B8189 /* >>> LinuxSignals.cpp */; }; >>> 23059A101958B319007B8189 /* SBUnixSignals.cpp in Sources >>> */ = {isa = PBXBuildFile; fileRef = 23059A0F1958B319007B8189 /* >>> SBUnixSignals.cpp */; }; >>> 23059A121958B3B2007B8189 /* SBUnixSignals.h in Headers */ >>> = {isa = PBXBuildFile; fileRef = 23059A111958B37B007B8189 /* SBUnixSignals.h >>> */; settings = {ATTRIBUTES = (Public, ); }; }; >>> + 230EC4591D63C3A7008DF59F /* CMakeLists.txt in CopyFiles >>> */ = {isa = PBXBuildFile; fileRef = 230EC4571D63C3A7008DF59F /* >>> CMakeLists.txt */; }; >>> + 230EC45B1D63C3BA008DF59F /* >>> ThreadPlanCallOnFunctionExit.cpp in Sources */ = {isa = PBXBuildFile; >>> fileRef = 230EC4581D63C3A7008DF59F /* ThreadPlanCallOnFunctionExit.cpp */; >>> }; >>> 2326CF441BDD643700A5CEAC /* liblldb-core.a in Frameworks >>> */ = {isa = PBXBuildFile; fileRef = 2689FFCA13353D7A00698AC0 /* >>> liblldb-core.a */; }; >>> 2326CF491BDD67D800A5CEAC /* libncurses.dylib in >>> Frameworks */ = {isa = PBXBuildFile; fileRef = 2326CF471BDD67C100A5CEAC /* >>> libncurses.dylib */; }; >>> 2326CF4B1BDD681800A5CEAC /* libz.dylib in Frameworks */ = >>> {isa = PBXBuildFile; fileRef = 2326CF4A1BDD681800A5CEAC /* libz.dylib */; }; >>> @@ -72,9 +74,15 @@ >>> 233B007F1960CB280090E598 /* ProcessLaunchInfo.cpp in >>> Sources */ = {isa = PBXBuildFile; fileRef = 233B007E1960CB280090E598 /* >>> ProcessLaunchInfo.cpp */; }; >>> 236124A41986B4E2004EFC37 /* IOObject.cpp in Sources */ = >>> {isa = PBXBuildFile; fileRef = 236124A21986B4E2004EFC37 /* IOObject.cpp */; >>> }; >>> 236124A51986B4E2004EFC37 /* Socket.cpp in Sources */ = >>> {isa = PBXBuildFile; fileRef = 236124A31986B4E2004EFC37 /* Socket.cpp */; }; >>> + 2374D7461D4BAA1D005C9575 /* CMakeLists.txt in CopyFiles >>> */ = {isa = PBXBuildFile; fileRef = 2374D7431D4BAA1D005C9575 /* >>> CMakeLists.txt */; }; >>> 2374D7521D4BB299005C9575 /* GDBRemoteClientBase.h in >>> CopyFiles */ = {isa = PBXBuildFile; fileRef = 2374D74F1D4BB299005C9575 /* >>> GDBRemoteClientBase.h */; }; >>> 2374D7531D4BB2FF005C9575 /* GDBRemoteClientBase.cpp in >>> Sources * > > > > > -- > -Todd > > _______________________________________________ > lldb-commits mailing list > lldb-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits > _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits