//===-- StructuredDataDarwinLog.h -------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef StructuredDataDarwinLog_h #define StructuredDataDarwinLog_h #include "lldb/Target/StructuredDataPlugin.h" #include // Forward declarations namespace sddarwinlog_private { class EnableCommand; } namespace lldb_private { class StructuredDataDarwinLog : public StructuredDataPlugin { friend sddarwinlog_private::EnableCommand; public: // Public static API static void Initialize(); static void Terminate(); static ConstString GetStaticPluginName(); /// Return whether the DarwinLog functionality is enabled. /// /// The DarwinLog functionality is enabled if the user expicitly enabled /// it with the enable command, or if the user has the setting set /// that controls if we always enable it for newly created/attached /// processes. /// /// \return /// True if DarwinLog support is/will be enabled for existing or /// newly launched/attached processes. static bool IsEnabled(); // PluginInterface API ConstString GetPluginName() override; uint32_t GetPluginVersion() override; // StructuredDataPlugin API bool SupportsStructuredDataType(ConstString type_name) override; void HandleArrivalOfStructuredData( Process &process, ConstString type_name, const StructuredData::ObjectSP &object_sp) override; Status GetDescription(const StructuredData::ObjectSP &object_sp, lldb_private::Stream &stream) override; bool GetEnabled(ConstString type_name) const override; void ModulesDidLoad(Process &process, ModuleList &module_list) override; ~StructuredDataDarwinLog() override; private: // Private constructors StructuredDataDarwinLog(const lldb::ProcessWP &process_wp); // Private static methods static lldb::StructuredDataPluginSP CreateInstance(Process &process); static void DebuggerInitialize(Debugger &debugger); static bool InitCompletionHookCallback(void *baton, StoppointCallbackContext *context, lldb::user_id_t break_id, lldb::user_id_t break_loc_id); static Status FilterLaunchInfo(ProcessLaunchInfo &launch_info, Target *target); // Internal helper methods used by friend classes void SetEnabled(bool enabled); void AddInitCompletionHook(Process &process); // Private methods void DumpTimestamp(Stream &stream, uint64_t timestamp); size_t DumpHeader(Stream &stream, const StructuredData::Dictionary &event); size_t HandleDisplayOfEvent(const StructuredData::Dictionary &event, Stream &stream); /// Call the enable command again, using whatever settings were initially /// made. void EnableNow(); // Private data bool m_recorded_first_timestamp; uint64_t m_first_timestamp_seen; bool m_is_enabled; std::mutex m_added_breakpoint_mutex; bool m_added_breakpoint; lldb::user_id_t m_breakpoint_id; }; } #endif /* StructuredDataPluginDarwinLog_hpp */