15#include "llvm/BinaryFormat/XCOFF.h"
18#include <sys/procfs.h>
24enum class ProcessState {
46 ProcessState &State) {
47 struct pstatus pstatusData;
52 std::unique_ptr<llvm::MemoryBuffer> StatusBuffer = std::move(*BufferOrError);
54 if (StatusBuffer->getBufferSize() <
sizeof(pstatusData))
57 std::memcpy(&pstatusData, StatusBuffer->getBufferStart(),
59 switch (pstatusData.pr_stat) {
61 State = ProcessState::Idle;
64 State = ProcessState::Running;
67 State = ProcessState::TracedOrStopped;
70 State = ProcessState::Zombie;
73 State = ProcessState::Unknown;
76 processInfo.
SetIsZombie(State == ProcessState::Zombie);
85 struct psinfo psinfoData;
90 std::unique_ptr<llvm::MemoryBuffer> PsinfoBuffer = std::move(*BufferOrError);
92 if (PsinfoBuffer->getBufferSize() <
sizeof(psinfoData))
95 std::memcpy(&psinfoData, PsinfoBuffer->getBufferStart(),
sizeof(psinfoData));
96 llvm::StringRef PathRef(
98 strnlen(psinfoData.pr_psargs,
sizeof(psinfoData.pr_psargs)));
110 process_info.
SetUserID(psinfoData.pr_uid);
119 ProcessState &State) {
120 process_info.
Clear();
137 static const char procdir[] =
"/proc/";
139 DIR *dirproc = opendir(procdir);
141 struct dirent *direntry =
nullptr;
142 const uid_t our_uid = getuid();
146 while ((direntry = readdir(dirproc)) !=
nullptr) {
149 if (!llvm::to_integer(direntry->d_name, pid))
160 if (
State == ProcessState::Zombie ||
161 State == ProcessState::TracedOrStopped)
166 if (!all_users && (our_uid != 0) && (process_info.
GetUserID() != our_uid))
169 if (match_info.
Matches(process_info))
170 process_infos.push_back(process_info);
174 return process_infos.size();
183 return Status(
"unimplemented");
static ProcessInstanceInfo::timespec convert(pr_timestruc64_t t)
static bool GetExePathAndIds(::pid_t pid, ProcessInstanceInfo &process_info)
static bool GetStatusInfo(::pid_t pid, ProcessInstanceInfo &processInfo, ProcessState &State)
static bool GetProcessAndStatInfo(::pid_t pid, ProcessInstanceInfo &process_info, ProcessState &State)
An architecture specification class.
bool SetArchitecture(ArchitectureType arch_type, uint32_t cpu, uint32_t sub, uint32_t os=0)
Change the architecture object type, CPU type and OS type.
void SetFile(llvm::StringRef path, Style style)
Change the file specified with a new path.
static Status ShellExpandArguments(ProcessLaunchInfo &launch_info)
Perform expansion of the command-line for this launch info This can potentially involve wildcard expa...
static uint32_t FindProcessesImpl(const ProcessInstanceInfoMatch &match_info, ProcessInstanceInfoList &proc_infos)
static bool GetProcessInfo(lldb::pid_t pid, ProcessInstanceInfo &proc_info)
void SetGroupID(uint32_t gid)
void SetArchitecture(const ArchSpec &arch)
void SetProcessID(lldb::pid_t pid)
FileSpec & GetExecutableFile()
uint32_t GetUserID() const
void SetUserID(uint32_t uid)
bool Matches(const ProcessInstanceInfo &proc_info) const
bool GetMatchAllUsers() const
void SetUserTime(struct timespec utime)
void SetEffectiveGroupID(uint32_t gid)
void SetIsZombie(bool is_zombie)
void SetCumulativeUserTime(struct timespec cutime)
void SetProcessGroupID(lldb::pid_t pgrp)
void SetProcessSessionID(lldb::pid_t session)
void SetCumulativeSystemTime(struct timespec cstime)
void SetSystemTime(struct timespec stime)
void SetParentProcessID(lldb::pid_t pid)
void SetEffectiveUserID(uint32_t uid)
#define LLDB_INVALID_CPUTYPE
#define LLDB_INVALID_PROCESS_ID
A class that represents a running process on the host machine.
llvm::ErrorOr< std::unique_ptr< llvm::MemoryBuffer > > getProcFile(::pid_t pid, ::pid_t tid, const llvm::Twine &file)
std::vector< ProcessInstanceInfo > ProcessInstanceInfoList