diff options
| -rw-r--r-- | lldb/include/lldb/Host/HostProcess.h | 44 | ||||
| -rw-r--r-- | lldb/include/lldb/Host/posix/HostProcessPosix.h | 46 | ||||
| -rw-r--r-- | lldb/include/lldb/Host/windows/HostProcessWindows.h | 44 | ||||
| -rw-r--r-- | lldb/include/lldb/lldb-types.h | 2 | ||||
| -rw-r--r-- | lldb/source/Host/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | lldb/source/Host/posix/HostProcessPosix.cpp | 101 | ||||
| -rw-r--r-- | lldb/source/Host/windows/HostProcessWindows.cpp | 112 |
7 files changed, 351 insertions, 0 deletions
diff --git a/lldb/include/lldb/Host/HostProcess.h b/lldb/include/lldb/Host/HostProcess.h new file mode 100644 index 00000000000..2c10709ce94 --- /dev/null +++ b/lldb/include/lldb/Host/HostProcess.h @@ -0,0 +1,44 @@ +//===-- HostProcess.h ------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef lldb_Host_HostProcess_h_ +#define lldb_Host_HostProcess_h_ + +//---------------------------------------------------------------------- +/// @class HostInfo HostInfo.h "lldb/Host/HostProcess.h" +/// @brief A class that represents a running process on the host machine. +/// +/// HostProcess allows querying and manipulation of processes running on the +/// host machine. It is not intended to be represent a process which is +/// being debugged, although the native debug engine of a platform may likely +/// back inferior processes by a HostProcess. +/// +/// HostProcess is implemented using static polymorphism so that on any given +/// platform, an instance of HostProcess will always be able to bind statically +/// to the concrete Process implementation for that platform. See HostInfo +/// for more details. +/// +//---------------------------------------------------------------------- + +#if defined(_WIN32) +#include "lldb/Host/windows/HostProcessWindows.h" +#define HOST_PROCESS_TYPE HostProcessWindows +#else +#include "lldb/Host/posix/HostProcessPosix.h" +#define HOST_PROCESS_TYPE HostProcessPosix +#endif + +namespace lldb_private +{ + typedef HOST_PROCESS_TYPE HostProcess; +} + +#undef HOST_PROCESS_TYPE + +#endif diff --git a/lldb/include/lldb/Host/posix/HostProcessPosix.h b/lldb/include/lldb/Host/posix/HostProcessPosix.h new file mode 100644 index 00000000000..aa003ee4845 --- /dev/null +++ b/lldb/include/lldb/Host/posix/HostProcessPosix.h @@ -0,0 +1,46 @@ +//===-- HostProcessPosix.h --------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef lldb_Host_HostProcesPosix_h_ +#define lldb_Host_HostProcesPosix_h_ + +#include "lldb/lldb-types.h" +#include "lldb/Core/Error.h" +#include "lldb/Target/ProcessLaunchInfo.h" + +namespace lldb_private +{ + +class FileSpec; + +class HostProcessPosix +{ + public: + static const lldb::pid_t kInvalidProcessId; + + HostProcessPosix(); + ~HostProcessPosix(); + + Error Signal(int signo) const; + static Error Signal(lldb::pid_t pid, int signo); + + Error Create(lldb::pid_t pid); + Error Terminate(int signo); + Error GetMainModule(FileSpec &file_spec) const; + + lldb::pid_t GetProcessId() const; + bool IsRunning() const; + + private: + + lldb::pid_t m_pid; +}; +} + +#endif diff --git a/lldb/include/lldb/Host/windows/HostProcessWindows.h b/lldb/include/lldb/Host/windows/HostProcessWindows.h new file mode 100644 index 00000000000..ca1578cdea1 --- /dev/null +++ b/lldb/include/lldb/Host/windows/HostProcessWindows.h @@ -0,0 +1,44 @@ +//===-- HostProcessWindows.h ------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef lldb_Host_HostProcessWindows_h_ +#define lldb_Host_HostProcessWindows_h_ + +#include "lldb/lldb-types.h" +#include "lldb/Core/Error.h" +#include "lldb/Target/ProcessLaunchInfo.h" + +namespace lldb_private +{ + +class FileSpec; + +class HostProcessWindows +{ + public: + HostProcessWindows(); + ~HostProcessWindows(); + + Error Create(lldb::pid_t pid); + Error Create(lldb::process_t process); + Error Terminate(); + Error GetMainModule(FileSpec &file_spec) const; + + lldb::pid_t GetProcessId() const; + bool IsRunning() const; + + private: + void Close(); + + lldb::pid_t m_pid; + lldb::process_t m_process; +}; +} + +#endif diff --git a/lldb/include/lldb/lldb-types.h b/lldb/include/lldb/lldb-types.h index b27f0875d3a..fee920f5b19 100644 --- a/lldb/include/lldb/lldb-types.h +++ b/lldb/include/lldb/lldb-types.h @@ -49,6 +49,7 @@ namespace lldb typedef void* mutex_t; typedef void* condition_t; typedef void* rwlock_t; + typedef void* process_t; // Process type is HANDLE typedef uintptr_t thread_t; // Host thread type typedef uint32_t thread_key_t; typedef void * thread_arg_t; // Host thread argument type @@ -68,6 +69,7 @@ namespace lldb typedef ::pthread_mutex_t mutex_t; typedef pthread_cond_t condition_t; typedef pthread_rwlock_t rwlock_t; + typedef uint64_t process_t; // Process type is just a pid. typedef pthread_t thread_t; // Host thread type typedef pthread_key_t thread_key_t; typedef void * thread_arg_t; // Host thread argument type diff --git a/lldb/source/Host/CMakeLists.txt b/lldb/source/Host/CMakeLists.txt index 18077122540..01b91bf7c8c 100644 --- a/lldb/source/Host/CMakeLists.txt +++ b/lldb/source/Host/CMakeLists.txt @@ -33,6 +33,7 @@ if (CMAKE_SYSTEM_NAME MATCHES "Windows") windows/FileSystem.cpp windows/Host.cpp windows/HostInfoWindows.cpp + windows/HostProcessWindows.cpp windows/ProcessRunLock.cpp windows/Mutex.cpp windows/Condition.cpp @@ -43,6 +44,7 @@ else() add_host_subdirectory(posix posix/FileSystem.cpp posix/HostInfoPosix.cpp + posix/HostProcessPosix.cpp ) if (CMAKE_SYSTEM_NAME MATCHES "Darwin") diff --git a/lldb/source/Host/posix/HostProcessPosix.cpp b/lldb/source/Host/posix/HostProcessPosix.cpp new file mode 100644 index 00000000000..1e5a62ffb62 --- /dev/null +++ b/lldb/source/Host/posix/HostProcessPosix.cpp @@ -0,0 +1,101 @@ +//===-- HostProcessWindows.cpp ----------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "lldb/Host/posix/HostProcessPosix.h" +#include "lldb/Host/FileSystem.h" + +#include "llvm/ADT/STLExtras.h" + +#include <limits.h> + +using namespace lldb_private; + +HostProcessPosix::HostProcessPosix() +: m_pid(kInvalidProcessId) +{ +} + +HostProcessPosix::~HostProcessPosix() +{ +} + +Error HostProcessPosix::Create(lldb::pid_t pid) +{ + Error error; + if (pid == kInvalidProcessId) + error.SetErrorString("Attempt to create an invalid process"); + + m_pid = pid; + return error; +} + +Error HostProcessPosix::Signal(int signo) const +{ + if (m_pid <= 0) + { + Error error; + error.SetErrorString("HostProcessPosix refers to an invalid process"); + return error; + } + + return HostProcessPosix::Signal(m_pid, signo); +} + +Error HostProcessPosix::Signal(lldb::pid_t pid, int signo) +{ + Error error; + + if (-1 == ::kill(pid, signo)) + error.SetErrorToErrno(); + + return error; +} + +Error HostProcessPosix::GetMainModule(FileSpec &file_spec) const +{ + Error error; + + // 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", m_pid) <= 0) + { + error.SetErrorString("Unable to build /proc/<pid>/exe string"); + return error; + } + + error = FileSystem::Readlink(link_path, exe_path, llvm::array_lengthof(exe_path)); + if (!error.Success()) + return error; + + const ssize_t len = strlen(exe_path); + // 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; + } + + file_spec.SetFile(exe_path, false); + return error; +} + +lldb::pid_t HostProcessPosix::GetProcessId() const +{ + return m_pid; +} + +bool HostProcessPosix::IsRunning() const +{ + // Send this process the null signal. If it succeeds the process is running. + Error error = Signal(0); + return error.Success(); +} diff --git a/lldb/source/Host/windows/HostProcessWindows.cpp b/lldb/source/Host/windows/HostProcessWindows.cpp new file mode 100644 index 00000000000..7a1ad955e3b --- /dev/null +++ b/lldb/source/Host/windows/HostProcessWindows.cpp @@ -0,0 +1,112 @@ +//===-- HostProcessWindows.cpp ----------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "lldb/Host/windows/windows.h" + +#include <Psapi.h> + +#include "lldb/Host/windows/HostProcessWindows.h" + +#include "llvm/ADT/STLExtras.h" + +using namespace lldb_private; + +HostProcessWindows::HostProcessWindows() + : m_process(NULL) + , m_pid(0) +{ +} + +HostProcessWindows::~HostProcessWindows() +{ + Close(); +} + +Error HostProcessWindows::Create(lldb::pid_t pid) +{ + Error error; + if (pid == m_pid) + return error; + Close(); + + m_process = ::OpenProcess(PROCESS_TERMINATE | PROCESS_QUERY_LIMITED_INFORMATION, FALSE, pid); + if (m_process == NULL) + { + error.SetError(::GetLastError(), lldb::eErrorTypeWin32); + return error; + } + m_pid = pid; + return error; +} + +Error HostProcessWindows::Create(lldb::process_t process) +{ + Error error; + if (process == m_process) + return error; + Close(); + + m_pid = ::GetProcessId(process); + if (m_pid == 0) + error.SetError(::GetLastError(), lldb::eErrorTypeWin32); + m_process = process; + return error; +} + +Error HostProcessWindows::Terminate() +{ + Error error; + if (m_process == NULL) + error.SetError(ERROR_INVALID_HANDLE, lldb::eErrorTypeWin32); + + if (!::TerminateProcess(m_process, 0)) + error.SetError(::GetLastError(), lldb::eErrorTypeWin32); + + return error; +} + +Error HostProcessWindows::GetMainModule(FileSpec &file_spec) const +{ + Error error; + if (m_process == NULL) + error.SetError(ERROR_INVALID_HANDLE, lldb::eErrorTypeWin32); + + char path[MAX_PATH] = { 0 }; + if (::GetProcessImageFileName(m_process, path, llvm::array_lengthof(path))) + file_spec.SetFile(path, false); + else + error.SetError(::GetLastError(), lldb::eErrorTypeWin32); + + return error; +} + +lldb::pid_t HostProcessWindows::GetProcessId() const +{ + return m_pid; +} + +bool HostProcessWindows::IsRunning() const +{ + if (m_process == NULL) + return false; + + DWORD code = 0; + if (!::GetExitCodeProcess(m_process, &code)) + return false; + + return (code == STILL_ACTIVE); +} + +void HostProcessWindows::Close() +{ + if (m_process != NULL) + ::CloseHandle(m_process); + m_process = nullptr; + m_pid = 0; +} |

