uint32_t Host::FindProcesses (const ProcessInstanceInfoMatch &match_info, ProcessInstanceInfoList &process_infos) { process_infos.Clear(); AutoHandle snapshot(CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)); if (!snapshot.IsValid()) return 0; PROCESSENTRY32 pe = {0}; pe.dwSize = sizeof(PROCESSENTRY32); if (Process32First(snapshot.get(), &pe)) { do { AutoHandle handle(::OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, pe.th32ProcessID), nullptr); ProcessInstanceInfo process; process.SetExecutableFile(FileSpec(pe.szExeFile, false), true); process.SetProcessID(pe.th32ProcessID); process.SetParentProcessID(pe.th32ParentProcessID); GetProcessExecutableAndTriple(handle, process); if (match_info.MatchAllProcesses() || match_info.Matches(process)) process_infos.Append(process); } while (Process32Next(snapshot.get(), &pe)); } return process_infos.GetSize(); }
bool ProcessElfCore::GetProcessInfo(ProcessInstanceInfo &info) { info.Clear(); info.SetProcessID(GetID()); info.SetArchitecture(GetArchitecture()); lldb::ModuleSP module_sp = GetTarget().GetExecutableModule(); if (module_sp) { const bool add_exe_file_as_first_arg = false; info.SetExecutableFile(GetTarget().GetExecutableModule()->GetFileSpec(), add_exe_file_as_first_arg); } return true; }
bool Host::GetProcessInfo (lldb::pid_t pid, ProcessInstanceInfo &process_info) { process_info.SetProcessID(pid); if (GetNetBSDProcessArgs(NULL, process_info)) { GetNetBSDProcessCPUType(process_info); GetNetBSDProcessUserAndGroup(process_info); return true; } process_info.Clear(); return false; }
bool Host::GetProcessInfo (lldb::pid_t pid, ProcessInstanceInfo &process_info) { process_info.Clear(); AutoHandle handle(::OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid), nullptr); if (!handle.IsValid()) return false; process_info.SetProcessID(pid); GetProcessExecutableAndTriple(handle, process_info); // Need to read the PEB to get parent process and command line arguments. return true; }
bool Host::GetProcessInfo (lldb::pid_t pid, ProcessInstanceInfo &process_info) { process_info.SetProcessID(pid); if (GetFreeBSDProcessArgs(NULL, process_info)) { // should use libprocstat instead of going right into sysctl? GetFreeBSDProcessCPUType(process_info); GetFreeBSDProcessUserAndGroup(process_info); return true; } process_info.Clear(); return false; }
static bool GetProcessAndStatInfo (lldb::pid_t pid, ProcessInstanceInfo &process_info, ProcessStatInfo &stat_info, lldb::pid_t &tracerpid) { tracerpid = 0; process_info.Clear(); ::memset (&stat_info, 0, sizeof(stat_info)); stat_info.ppid = LLDB_INVALID_PROCESS_ID; // Use special code here because proc/[pid]/exe is a symbolic link. char link_path[PATH_MAX]; char exe_path[PATH_MAX] = ""; if (snprintf (link_path, PATH_MAX, "/proc/%" PRIu64 "/exe", pid) <= 0) return false; ssize_t len = readlink (link_path, exe_path, sizeof(exe_path) - 1); if (len <= 0) return false; // readlink does not append a null byte. exe_path[len] = 0; // If the binary has been deleted, the link name has " (deleted)" appended. // Remove if there. static const ssize_t deleted_len = strlen(" (deleted)"); if (len > deleted_len && !strcmp(exe_path + len - deleted_len, " (deleted)")) { exe_path[len - deleted_len] = 0; } else { GetELFProcessCPUType (exe_path, process_info); } process_info.SetProcessID(pid); process_info.GetExecutableFile().SetFile(exe_path, false); lldb::DataBufferSP buf_sp; // Get the process environment. buf_sp = ReadProcPseudoFile(pid, "environ"); Args &info_env = process_info.GetEnvironmentEntries(); char *next_var = (char *)buf_sp->GetBytes(); char *end_buf = next_var + buf_sp->GetByteSize(); while (next_var < end_buf && 0 != *next_var) { info_env.AppendArgument(next_var); next_var += strlen(next_var) + 1; } // Get the commond line used to start the process. buf_sp = ReadProcPseudoFile(pid, "cmdline"); // Grab Arg0 first. char *cmd = (char *)buf_sp->GetBytes(); process_info.SetArg0(cmd); // Now process any remaining arguments. Args &info_args = process_info.GetArguments(); char *next_arg = cmd + strlen(cmd) + 1; end_buf = cmd + buf_sp->GetByteSize(); while (next_arg < end_buf && 0 != *next_arg) { info_args.AppendArgument(next_arg); next_arg += strlen(next_arg) + 1; } // Read /proc/$PID/stat to get our parent pid. if (ReadProcPseudoFileStat (pid, stat_info)) { process_info.SetParentProcessID (stat_info.ppid); } // Get User and Group IDs and get tracer pid. GetLinuxProcessUserAndGroup (pid, process_info, tracerpid); return true; }
static bool GetProcessAndStatInfo(::pid_t pid, ProcessInstanceInfo &process_info, ProcessState &State, ::pid_t &tracerpid) { tracerpid = 0; process_info.Clear(); Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS)); // We can't use getProcFile here because proc/[pid]/exe is a symbolic link. llvm::SmallString<64> ProcExe; (llvm::Twine("/proc/") + llvm::Twine(pid) + "/exe").toVector(ProcExe); std::string ExePath(PATH_MAX, '\0'); ssize_t len = readlink(ProcExe.c_str(), &ExePath[0], PATH_MAX); if (len <= 0) { LLDB_LOG(log, "failed to read link exe link for {0}: {1}", pid, Status(errno, eErrorTypePOSIX)); return false; } ExePath.resize(len); // If the binary has been deleted, the link name has " (deleted)" appended. // Remove if there. llvm::StringRef PathRef = ExePath; PathRef.consume_back(" (deleted)"); GetELFProcessCPUType(PathRef, process_info); // Get the process environment. auto BufferOrError = getProcFile(pid, "environ"); if (!BufferOrError) return false; std::unique_ptr<llvm::MemoryBuffer> Environ = std::move(*BufferOrError); // Get the command line used to start the process. BufferOrError = getProcFile(pid, "cmdline"); if (!BufferOrError) return false; std::unique_ptr<llvm::MemoryBuffer> Cmdline = std::move(*BufferOrError); // Get User and Group IDs and get tracer pid. if (!GetStatusInfo(pid, process_info, State, tracerpid)) return false; process_info.SetProcessID(pid); process_info.GetExecutableFile().SetFile(PathRef, false); process_info.GetArchitecture().MergeFrom(HostInfo::GetArchitecture()); llvm::StringRef Rest = Environ->getBuffer(); while (!Rest.empty()) { llvm::StringRef Var; std::tie(Var, Rest) = Rest.split('\0'); process_info.GetEnvironmentEntries().AppendArgument(Var); } llvm::StringRef Arg0; std::tie(Arg0, Rest) = Cmdline->getBuffer().split('\0'); process_info.SetArg0(Arg0); while (!Rest.empty()) { llvm::StringRef Arg; std::tie(Arg, Rest) = Rest.split('\0'); process_info.GetArguments().AppendArgument(Arg); } return true; }