Skip to content

Commit

Permalink
Enable lldb-server on Windows
Browse files Browse the repository at this point in the history
Summary:
This commit contains three small changes to enable lldb-server on Windows.

- Add lldb-server for Windows to the build
- Disable pty redirection on Windows for the initial lldb-server bring up
- Add a support to get the parent pid for a process on Windows
- Ifdef some signals which aren't supported on Windows

Thanks to Hui Huang for the help with this patch!

Reviewers: labath

Reviewed By: labath

Subscribers: JDevlieghere, compnerd, Hui, amccarth, xiaobai, srhines, mgorny, lldb-commits

Tags: #lldb

Differential Revision: https://reviews.llvm.org/D61686

llvm-svn: 368774
  • Loading branch information
aaronsm committed Aug 13, 2019
1 parent 0df9c8c commit 216944e
Show file tree
Hide file tree
Showing 6 changed files with 34 additions and 4 deletions.
2 changes: 1 addition & 1 deletion lldb/cmake/modules/LLDBConfig.cmake
Expand Up @@ -408,7 +408,7 @@ list(APPEND system_libs ${CMAKE_DL_LIBS})

# Figure out if lldb could use lldb-server. If so, then we'll
# ensure we build lldb-server when an lldb target is being built.
if (CMAKE_SYSTEM_NAME MATCHES "Android|Darwin|FreeBSD|Linux|NetBSD")
if (CMAKE_SYSTEM_NAME MATCHES "Android|Darwin|FreeBSD|Linux|NetBSD|Windows")
set(LLDB_CAN_USE_LLDB_SERVER ON)
else()
set(LLDB_CAN_USE_LLDB_SERVER OFF)
Expand Down
18 changes: 17 additions & 1 deletion lldb/source/Host/windows/Host.cpp
Expand Up @@ -169,7 +169,23 @@ bool Host::GetProcessInfo(lldb::pid_t pid, ProcessInstanceInfo &process_info) {
GetProcessExecutableAndTriple(handle, process_info);

// Need to read the PEB to get parent process and command line arguments.
return true;

AutoHandle snapshot(CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0));
if (!snapshot.IsValid())
return false;

PROCESSENTRY32W pe;
pe.dwSize = sizeof(PROCESSENTRY32W);
if (Process32FirstW(snapshot.get(), &pe)) {
do {
if (pe.th32ProcessID == pid) {
process_info.SetParentProcessID(pe.th32ParentProcessID);
return true;
}
} while (Process32NextW(snapshot.get(), &pe));
}

return false;
}

llvm::Expected<HostThread> Host::StartMonitoringChildProcess(
Expand Down
Expand Up @@ -39,6 +39,8 @@

#if defined(__APPLE__)
#define DEBUGSERVER_BASENAME "debugserver"
#elif defined(_WIN32)
#define DEBUGSERVER_BASENAME "lldb-server.exe"
#else
#define DEBUGSERVER_BASENAME "lldb-server"
#endif
Expand Down
Expand Up @@ -217,8 +217,13 @@ Status GDBRemoteCommunicationServerLLGS::LaunchProcess() {
m_process_launch_info.GetFlags().Set(eLaunchFlagDebug);

if (should_forward_stdio) {
// Temporarily relax the following for Windows until we can take advantage
// of the recently added pty support. This doesn't really affect the use of
// lldb-server on Windows.
#if !defined(_WIN32)
if (llvm::Error Err = m_process_launch_info.SetUpPtyRedirection())
return Status(std::move(Err));
#endif
}

{
Expand Down
2 changes: 1 addition & 1 deletion lldb/tools/lldb-server/lldb-gdbserver.cpp
Expand Up @@ -514,7 +514,7 @@ int main_gdbserver(int argc, char *argv[]) {
handle_launch(gdb_server, argc, argv);

// Print version info.
printf("%s-%s", LLGS_PROGRAM_NAME, LLGS_VERSION_STR);
printf("%s-%s\n", LLGS_PROGRAM_NAME, LLGS_VERSION_STR);

ConnectToRemote(mainloop, gdb_server, reverse_connect, host_and_port,
progname, subcommand, named_pipe_path.c_str(),
Expand Down
9 changes: 8 additions & 1 deletion lldb/tools/lldb-server/lldb-platform.cpp
Expand Up @@ -15,8 +15,9 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#if !defined(_WIN32)
#include <sys/wait.h>

#endif
#include <fstream>

#include "llvm/Support/FileSystem.h"
Expand Down Expand Up @@ -67,6 +68,7 @@ static struct option g_long_options[] = {
#define HIGH_PORT (49151u)
#endif

#if !defined(_WIN32)
// Watch for signals
static void signal_handler(int signo) {
switch (signo) {
Expand All @@ -81,6 +83,7 @@ static void signal_handler(int signo) {
break;
}
}
#endif

static void display_usage(const char *progname, const char *subcommand) {
fprintf(stderr, "Usage:\n %s %s [--log-file log-file-name] [--log-channels "
Expand Down Expand Up @@ -131,8 +134,10 @@ int main_platform(int argc, char *argv[]) {
const char *subcommand = argv[1];
argc--;
argv++;
#if !defined(_WIN32)
signal(SIGPIPE, SIG_IGN);
signal(SIGHUP, signal_handler);
#endif
int long_option_index = 0;
Status error;
std::string listen_host_port;
Expand Down Expand Up @@ -309,8 +314,10 @@ int main_platform(int argc, char *argv[]) {
printf("Connection established.\n");
if (g_server) {
// Collect child zombie processes.
#if !defined(_WIN32)
while (waitpid(-1, nullptr, WNOHANG) > 0)
;
#endif
if (fork()) {
// Parent doesn't need a connection to the lldb client
delete conn;
Expand Down

0 comments on commit 216944e

Please sign in to comment.