LLDB mainline
ProcessInfo.h
Go to the documentation of this file.
1//===-- ProcessInfo.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_UTILITY_PROCESSINFO_H
10#define LLDB_UTILITY_PROCESSINFO_H
11
13#include "lldb/Utility/Args.h"
18#include <vector>
19
20namespace lldb_private {
21
22class UserIDResolver;
23
24// ProcessInfo
25//
26// A base class for information for a process. This can be used to fill
27// out information for a process prior to launching it, or it can be used for
28// an instance of a process and can be filled in with the existing values for
29// that process.
31public:
33
34 ProcessInfo(const char *name, const ArchSpec &arch, lldb::pid_t pid);
35
36 void Clear();
37
38 const char *GetName() const;
39
40 llvm::StringRef GetNameAsStringRef() const;
41
43
44 void SetExecutableFile(const FileSpec &exe_file,
45 bool add_exe_file_as_first_arg);
46
47 const FileSpec &GetExecutableFile() const { return m_executable; }
48
49 uint32_t GetUserID() const { return m_uid; }
50
51 uint32_t GetGroupID() const { return m_gid; }
52
53 bool UserIDIsValid() const { return m_uid != UINT32_MAX; }
54
55 bool GroupIDIsValid() const { return m_gid != UINT32_MAX; }
56
57 void SetUserID(uint32_t uid) { m_uid = uid; }
58
59 void SetGroupID(uint32_t gid) { m_gid = gid; }
60
62
63 const ArchSpec &GetArchitecture() const { return m_arch; }
64
65 void SetArchitecture(const ArchSpec &arch) { m_arch = arch; }
66
67 lldb::pid_t GetProcessID() const { return m_pid; }
68
69 void SetProcessID(lldb::pid_t pid) { m_pid = pid; }
70
72
73 void Dump(Stream &s, Platform *platform) const;
74
76
77 const Args &GetArguments() const { return m_arguments; }
78
79 llvm::StringRef GetArg0() const;
80
81 void SetArg0(llvm::StringRef arg);
82
83 void SetArguments(const Args &args, bool first_arg_is_executable);
84
85 void SetArguments(char const **argv, bool first_arg_is_executable);
86
88 const Environment &GetEnvironment() const { return m_environment; }
89
90 bool IsScriptedProcess() const;
91
94 }
95
97 m_scripted_metadata_sp = metadata_sp;
98 }
99
100 // Get and set the actual listener that will be used for the process events
102
103 void SetListener(const lldb::ListenerSP &listener_sp) {
104 m_listener_sp = listener_sp;
105 }
106
108
109 void SetHijackListener(const lldb::ListenerSP &listener_sp) {
110 m_hijack_listener_sp = listener_sp;
111 }
112
114
115 void SetShadowListener(const lldb::ListenerSP &listener_sp) {
116 m_shadow_listener_sp = listener_sp;
117 }
118
119protected:
121 std::string m_arg0; // argv[0] if supported. If empty, then use m_executable.
122 // Not all process plug-ins support specifying an argv[0] that differs from
123 // the resolved platform executable (which is in m_executable)
124 Args m_arguments; // All program arguments except argv[0]
126 uint32_t m_uid = UINT32_MAX;
127 uint32_t m_gid = UINT32_MAX;
134};
135
136// ProcessInstanceInfo
137//
138// Describes an existing process and any discoverable information that pertains
139// to that process.
141public:
143
144 ProcessInstanceInfo(const char *name, const ArchSpec &arch, lldb::pid_t pid)
145 : ProcessInfo(name, arch, pid), m_euid(UINT32_MAX), m_egid(UINT32_MAX),
147
148 void Clear() {
153 }
154
155 uint32_t GetEffectiveUserID() const { return m_euid; }
156
157 uint32_t GetEffectiveGroupID() const { return m_egid; }
158
159 bool EffectiveUserIDIsValid() const { return m_euid != UINT32_MAX; }
160
161 bool EffectiveGroupIDIsValid() const { return m_egid != UINT32_MAX; }
162
163 void SetEffectiveUserID(uint32_t uid) { m_euid = uid; }
164
165 void SetEffectiveGroupID(uint32_t gid) { m_egid = gid; }
166
168
170
173 }
174
175 void Dump(Stream &s, UserIDResolver &resolver) const;
176
177 static void DumpTableHeader(Stream &s, bool show_args, bool verbose);
178
179 void DumpAsTableRow(Stream &s, UserIDResolver &resolver, bool show_args,
180 bool verbose) const;
181
182protected:
183 uint32_t m_euid = UINT32_MAX;
184 uint32_t m_egid = UINT32_MAX;
186};
187
188typedef std::vector<ProcessInstanceInfo> ProcessInstanceInfoList;
189
191public:
193
194 uint32_t GetSize() const { return m_list.size(); }
195
196 bool GetProcessInfoAtIndex(uint32_t idx, ProcessInstanceInfo &info) {
197 if (idx < m_list.size()) {
198 info = m_list[idx];
199 return true;
200 }
201 return false;
202 }
203
204 void Clear() { return m_list.clear(); }
205
206private:
208};
209
210// ProcessInstanceInfoMatch
211//
212// A class to help matching one ProcessInstanceInfo to another.
213
215public:
217
218 ProcessInstanceInfoMatch(const char *process_name,
219 NameMatch process_name_match_type)
220 : m_name_match_type(process_name_match_type), m_match_all_users(false) {
222 FileSpec::Style::native);
223 }
224
226
228
229 bool GetMatchAllUsers() const { return m_match_all_users; }
230
232
234
235 void SetNameMatchType(NameMatch name_match_type) {
236 m_name_match_type = name_match_type;
237 }
238
239 /// Return true iff the architecture in this object matches arch_spec.
240 bool ArchitectureMatches(const ArchSpec &arch_spec) const;
241
242 /// Return true iff the process name in this object matches process_name.
243 bool NameMatches(const char *process_name) const;
244
245 /// Return true iff the process ID and parent process IDs in this object match
246 /// the ones in proc_info.
247 bool ProcessIDsMatch(const ProcessInstanceInfo &proc_info) const;
248
249 /// Return true iff the (both effective and real) user and group IDs in this
250 /// object match the ones in proc_info.
251 bool UserIDsMatch(const ProcessInstanceInfo &proc_info) const;
252
253 bool Matches(const ProcessInstanceInfo &proc_info) const;
254
255 bool MatchAllProcesses() const;
256 void Clear();
257
258protected:
261 bool m_match_all_users = false;
262};
263
264} // namespace lldb_private
265
266#endif // LLDB_UTILITY_PROCESSINFO_H
An architecture specification class.
Definition: ArchSpec.h:31
A command line argument class.
Definition: Args.h:33
A file utility class.
Definition: FileSpec.h:56
void SetFile(llvm::StringRef path, Style style)
Change the file specified with a new path.
Definition: FileSpec.cpp:174
A plug-in interface definition class for debug platform that includes many platform abilities such as...
Definition: Platform.h:74
ProcessInstanceInfoList m_list
Definition: ProcessInfo.h:207
ProcessInfoList(const ProcessInstanceInfoList &list)
Definition: ProcessInfo.h:192
bool GetProcessInfoAtIndex(uint32_t idx, ProcessInstanceInfo &info)
Definition: ProcessInfo.h:196
const FileSpec & GetExecutableFile() const
Definition: ProcessInfo.h:47
void SetGroupID(uint32_t gid)
Definition: ProcessInfo.h:59
void SetHijackListener(const lldb::ListenerSP &listener_sp)
Definition: ProcessInfo.h:109
void SetExecutableFile(const FileSpec &exe_file, bool add_exe_file_as_first_arg)
Definition: ProcessInfo.cpp:65
lldb::ScriptedMetadataSP GetScriptedMetadata() const
Definition: ProcessInfo.h:92
lldb::ListenerSP GetHijackListener() const
Definition: ProcessInfo.h:107
void SetArchitecture(const ArchSpec &arch)
Definition: ProcessInfo.h:65
lldb::ScriptedMetadataSP m_scripted_metadata_sp
Definition: ProcessInfo.h:130
bool ProcessIDIsValid() const
Definition: ProcessInfo.h:71
void SetShadowListener(const lldb::ListenerSP &listener_sp)
Definition: ProcessInfo.h:115
void SetArg0(llvm::StringRef arg)
Definition: ProcessInfo.cpp:82
const char * GetName() const
Definition: ProcessInfo.cpp:45
void Dump(Stream &s, Platform *platform) const
Definition: ProcessInfo.cpp:53
lldb::pid_t GetProcessID() const
Definition: ProcessInfo.h:67
llvm::StringRef GetArg0() const
Definition: ProcessInfo.cpp:80
void SetScriptedMetadata(lldb::ScriptedMetadataSP metadata_sp)
Definition: ProcessInfo.h:96
lldb::ListenerSP m_hijack_listener_sp
Definition: ProcessInfo.h:132
void SetArguments(const Args &args, bool first_arg_is_executable)
void SetProcessID(lldb::pid_t pid)
Definition: ProcessInfo.h:69
lldb::ListenerSP m_listener_sp
Definition: ProcessInfo.h:131
FileSpec & GetExecutableFile()
Definition: ProcessInfo.h:42
void SetListener(const lldb::ListenerSP &listener_sp)
Definition: ProcessInfo.h:103
lldb::ListenerSP GetListener() const
Definition: ProcessInfo.h:101
const Environment & GetEnvironment() const
Definition: ProcessInfo.h:88
lldb::ListenerSP GetShadowListener() const
Definition: ProcessInfo.h:113
bool UserIDIsValid() const
Definition: ProcessInfo.h:53
const ArchSpec & GetArchitecture() const
Definition: ProcessInfo.h:63
uint32_t GetUserID() const
Definition: ProcessInfo.h:49
const Args & GetArguments() const
Definition: ProcessInfo.h:77
Environment & GetEnvironment()
Definition: ProcessInfo.h:87
llvm::StringRef GetNameAsStringRef() const
Definition: ProcessInfo.cpp:49
uint32_t GetGroupID() const
Definition: ProcessInfo.h:51
bool IsScriptedProcess() const
void SetUserID(uint32_t uid)
Definition: ProcessInfo.h:57
bool GroupIDIsValid() const
Definition: ProcessInfo.h:55
ArchSpec & GetArchitecture()
Definition: ProcessInfo.h:61
lldb::ListenerSP m_shadow_listener_sp
Definition: ProcessInfo.h:133
bool NameMatches(const char *process_name) const
Return true iff the process name in this object matches process_name.
ProcessInstanceInfoMatch(const char *process_name, NameMatch process_name_match_type)
Definition: ProcessInfo.h:218
const ProcessInstanceInfo & GetProcessInfo() const
Definition: ProcessInfo.h:227
bool Matches(const ProcessInstanceInfo &proc_info) const
void SetNameMatchType(NameMatch name_match_type)
Definition: ProcessInfo.h:235
ProcessInstanceInfo & GetProcessInfo()
Definition: ProcessInfo.h:225
bool ProcessIDsMatch(const ProcessInstanceInfo &proc_info) const
Return true iff the process ID and parent process IDs in this object match the ones in proc_info.
bool UserIDsMatch(const ProcessInstanceInfo &proc_info) const
Return true iff the (both effective and real) user and group IDs in this object match the ones in pro...
bool ArchitectureMatches(const ArchSpec &arch_spec) const
Return true iff the architecture in this object matches arch_spec.
uint32_t GetEffectiveUserID() const
Definition: ProcessInfo.h:155
ProcessInstanceInfo(const char *name, const ArchSpec &arch, lldb::pid_t pid)
Definition: ProcessInfo.h:144
void SetEffectiveGroupID(uint32_t gid)
Definition: ProcessInfo.h:165
static void DumpTableHeader(Stream &s, bool show_args, bool verbose)
lldb::pid_t GetParentProcessID() const
Definition: ProcessInfo.h:167
uint32_t GetEffectiveGroupID() const
Definition: ProcessInfo.h:157
void Dump(Stream &s, UserIDResolver &resolver) const
void DumpAsTableRow(Stream &s, UserIDResolver &resolver, bool show_args, bool verbose) const
void SetParentProcessID(lldb::pid_t pid)
Definition: ProcessInfo.h:169
void SetEffectiveUserID(uint32_t uid)
Definition: ProcessInfo.h:163
A stream class that can stream formatted output to a file.
Definition: Stream.h:28
An abstract interface for things that know how to map numeric user/group IDs into names.
#define UINT32_MAX
Definition: lldb-defines.h:19
#define LLDB_INVALID_PROCESS_ID
Definition: lldb-defines.h:89
A class that represents a running process on the host machine.
Definition: SBAttachInfo.h:14
std::vector< ProcessInstanceInfo > ProcessInstanceInfoList
Definition: Host.h:32
std::shared_ptr< lldb_private::ScriptedMetadata > ScriptedMetadataSP
Definition: lldb-forward.h:399
uint64_t pid_t
Definition: lldb-types.h:81
std::shared_ptr< lldb_private::Listener > ListenerSP
Definition: lldb-forward.h:360