1//===-- StructuredDataDarwinLog.h -------------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLDB_SOURCE_PLUGINS_STRUCTUREDDATA_DARWINLOG_STRUCTUREDDATADARWINLOG_H
10#define LLDB_SOURCE_PLUGINS_STRUCTUREDDATA_DARWINLOG_STRUCTUREDDATADARWINLOG_H
11
12#include "lldb/Target/StructuredDataPlugin.h"
13
14#include <mutex>
15
16// Forward declarations
17namespace sddarwinlog_private {
18class EnableCommand;
19}
20
21namespace lldb_private {
22
23class StructuredDataDarwinLog : public StructuredDataPlugin {
24 friend sddarwinlog_private::EnableCommand;
25
26public:
27 // Public static API
28
29 static void Initialize();
30
31 static void Terminate();
32
33 static llvm::StringRef GetStaticPluginName() { return "darwin-log"; }
34
35 /// Return whether the DarwinLog functionality is enabled.
36 ///
37 /// The DarwinLog functionality is enabled if the user explicitly enabled
38 /// it with the enable command, or if the user has the setting set
39 /// that controls if we always enable it for newly created/attached
40 /// processes.
41 ///
42 /// \return
43 /// True if DarwinLog support is/will be enabled for existing or
44 /// newly launched/attached processes.
45 static bool IsEnabled();
46
47 // PluginInterface API
48
49 llvm::StringRef GetPluginName() override { return GetStaticPluginName(); }
50
51 // StructuredDataPlugin API
52
53 bool SupportsStructuredDataType(llvm::StringRef type_name) override;
54
55 void HandleArrivalOfStructuredData(
56 Process &process, llvm::StringRef type_name,
57 const StructuredData::ObjectSP &object_sp) override;
58
59 Status GetDescription(const StructuredData::ObjectSP &object_sp,
60 lldb_private::Stream &stream) override;
61
62 bool GetEnabled(llvm::StringRef type_name) const override;
63
64 void ModulesDidLoad(Process &process, ModuleList &module_list) override;
65
66 ~StructuredDataDarwinLog() override;
67
68private:
69 // Private constructors
70
71 StructuredDataDarwinLog(const lldb::ProcessWP &process_wp);
72
73 // Private static methods
74
75 static lldb::StructuredDataPluginSP CreateInstance(Process &process);
76
77 static void DebuggerInitialize(Debugger &debugger);
78
79 static bool InitCompletionHookCallback(void *baton,
80 StoppointCallbackContext *context,
81 lldb::user_id_t break_id,
82 lldb::user_id_t break_loc_id);
83
84 static Status FilterLaunchInfo(ProcessLaunchInfo &launch_info,
85 Target *target);
86
87 // Internal helper methods used by friend classes
88 void SetEnabled(bool enabled);
89
90 void AddInitCompletionHook(Process &process);
91
92 // Private methods
93
94 void DumpTimestamp(Stream &stream, uint64_t timestamp);
95
96 size_t DumpHeader(Stream &stream, const StructuredData::Dictionary &event);
97
98 size_t HandleDisplayOfEvent(const StructuredData::Dictionary &event,
99 Stream &stream);
100
101 /// Call the enable command again, using whatever settings were initially
102 /// made.
103
104 void EnableNow();
105
106 // Private data
107 bool m_recorded_first_timestamp;
108 uint64_t m_first_timestamp_seen;
109 bool m_is_enabled;
110 std::mutex m_added_breakpoint_mutex;
111 bool m_added_breakpoint;
112 lldb::user_id_t m_breakpoint_id;
113};
114}
115
116#endif // LLDB_SOURCE_PLUGINS_STRUCTUREDDATA_DARWINLOG_STRUCTUREDDATADARWINLOG_H
117

source code of lldb/source/Plugins/StructuredData/DarwinLog/StructuredDataDarwinLog.h