fjricci updated this revision to Diff 47534.
fjricci added a comment.
Herald added a subscriber: srhines.
Apply clang-format
http://reviews.llvm.org/D17099
Files:
include/lldb/Target/Platform.h
include/lldb/Target/Process.h
source/Commands/CommandObjectProcess.cpp
source/Interpreter/CommandInterpreter.cpp
source/Plugins/Platform/Android/PlatformAndroidRemoteGDBServer.cpp
source/Plugins/Platform/Android/PlatformAndroidRemoteGDBServer.h
source/Plugins/Platform/POSIX/PlatformPOSIX.cpp
source/Plugins/Platform/POSIX/PlatformPOSIX.h
source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.cpp
source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.h
source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp
source/Plugins/Process/gdb-remote/GDBRemoteCommunication.h
source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
source/Plugins/Process/gdb-remote/ProcessGDBRemote.h
source/Target/Platform.cpp
source/Target/Process.cpp
Index: source/Target/Process.cpp
===================================================================
--- source/Target/Process.cpp
+++ source/Target/Process.cpp
@@ -3496,15 +3496,15 @@
}
Error
-Process::ConnectRemote (Stream *strm, const char *remote_url)
+Process::ConnectRemote(Stream *strm, const char *remote_url, bool reverse)
{
m_abi_sp.reset();
m_process_input_reader.reset();
// Find the process and its architecture. Make sure it matches the architecture
// of the current Target, and if not adjust it.
-
- Error error (DoConnectRemote (strm, remote_url));
+
+ Error error(DoConnectRemote(strm, remote_url, reverse));
if (error.Success())
{
if (GetID() != LLDB_INVALID_PROCESS_ID)
Index: source/Target/Platform.cpp
===================================================================
--- source/Target/Platform.cpp
+++ source/Target/Platform.cpp
@@ -2043,11 +2043,8 @@
}
lldb::ProcessSP
-Platform::ConnectProcess(const char* connect_url,
- const char* plugin_name,
- lldb_private::Debugger &debugger,
- lldb_private::Target *target,
- lldb_private::Error &error)
+Platform::ConnectProcess(const char *connect_url, const char *plugin_name, lldb_private::Debugger &debugger,
+ lldb_private::Target *target, lldb_private::Error &error, bool reverse)
{
error.Clear();
@@ -2074,7 +2071,7 @@
if (!process_sp)
return nullptr;
- error = process_sp->ConnectRemote(debugger.GetOutputFile().get(), connect_url);
+ error = process_sp->ConnectRemote(debugger.GetOutputFile().get(), connect_url, reverse);
if (error.Fail())
return nullptr;
Index: source/Plugins/Process/gdb-remote/ProcessGDBRemote.h
===================================================================
--- source/Plugins/Process/gdb-remote/ProcessGDBRemote.h
+++ source/Plugins/Process/gdb-remote/ProcessGDBRemote.h
@@ -97,8 +97,8 @@
WillAttachToProcessWithName (const char *process_name, bool wait_for_launch) override;
Error
- DoConnectRemote (Stream *strm, const char *remote_url) override;
-
+ DoConnectRemote(Stream *strm, const char *remote_url, bool reverse = false) override;
+
Error
WillLaunchOrAttach ();
Index: source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
===================================================================
--- source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
+++ source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
@@ -715,16 +715,22 @@
}
Error
-ProcessGDBRemote::DoConnectRemote (Stream *strm, const char *remote_url)
+ProcessGDBRemote::DoConnectRemote(Stream *strm, const char *remote_url, bool reverse)
{
Log *log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS));
Error error (WillLaunchOrAttach ());
if (error.Fail())
return error;
- error = ConnectToDebugserver (remote_url);
+ if (reverse)
+ {
+ error = m_gdb_comm.WaitForDebugserver(remote_url);
+ if (error.Fail())
+ return error;
+ }
+ error = ConnectToDebugserver(remote_url);
if (error.Fail())
return error;
StartAsyncThread ();
Index: source/Plugins/Process/gdb-remote/GDBRemoteCommunication.h
===================================================================
--- source/Plugins/Process/gdb-remote/GDBRemoteCommunication.h
+++ source/Plugins/Process/gdb-remote/GDBRemoteCommunication.h
@@ -161,6 +161,9 @@
return m_packet_timeout * TimeValue::MicroSecPerSec;
}
+ Error
+ WaitForDebugserver(const char *url);
+
//------------------------------------------------------------------
// Start a debugserver instance on the current host using the
// supplied connection URL.
@@ -339,7 +342,7 @@
DecompressPacket ();
Error
- StartListenThread (const char *hostname = "127.0.0.1", uint16_t port = 0);
+ StartListenThread(const char *listen_url = "listen://127.0.0.1:0");
bool
JoinListenThread ();
Index: source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp
===================================================================
--- source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp
+++ source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp
@@ -1066,20 +1066,15 @@
}
Error
-GDBRemoteCommunication::StartListenThread (const char *hostname, uint16_t port)
+GDBRemoteCommunication::StartListenThread(const char *listen_url)
{
Error error;
if (m_listen_thread.IsJoinable())
{
error.SetErrorString("listen thread already running");
}
else
{
- char listen_url[512];
- if (hostname && hostname[0])
- snprintf(listen_url, sizeof(listen_url), "listen://%s:%i", hostname, port);
- else
- snprintf(listen_url, sizeof(listen_url), "listen://%i", port);
m_listen_url = listen_url;
SetConnection(new ConnectionFileDescriptor());
m_listen_thread = ThreadLauncher::LaunchThread(listen_url, GDBRemoteCommunication::ListenThread, this, &error);
@@ -1112,11 +1107,41 @@
}
Error
-GDBRemoteCommunication::StartDebugserverProcess (const char *url,
- Platform *platform,
- ProcessLaunchInfo &launch_info,
- uint16_t *port,
- const Args& inferior_args)
+GDBRemoteCommunication::WaitForDebugserver(const char *url)
+{
+ Error error;
+ Log *log(ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_PROCESS));
+ if (log)
+ log->Printf("GDBRemoteCommunication::%s(url=%s)", __FUNCTION__, url ? url : "<empty>");
+
+ std::string listen_url(url);
+ size_t start_replace = listen_url.find("connect");
+ listen_url.replace(start_replace, start_replace + strlen("connect"), "listen");
+
+ error = StartListenThread(listen_url.c_str());
+ if (error.Fail())
+ {
+ if (log)
+ log->Printf("GDBRemoteCommunication::%s() unable to start listen thread: %s", __FUNCTION__,
+ error.AsCString());
+ return error;
+ }
+
+ // Make sure we actually connect with the debugserver...
+ JoinListenThread();
+
+ if (error.Fail())
+ {
+ if (log)
+ log->Printf("GDBRemoteCommunication::%s() failed: %s", __FUNCTION__, error.AsCString());
+ }
+
+ return error;
+}
+
+Error
+GDBRemoteCommunication::StartDebugserverProcess(const char *url, Platform *platform, ProcessLaunchInfo &launch_info,
+ uint16_t *port, const Args &inferior_args)
{
Log *log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS));
if (log)
@@ -1258,7 +1283,7 @@
{
// No host and port given, so lets listen on our end and make the debugserver
// connect to us..
- error = StartListenThread ("127.0.0.1", 0);
+ error = StartListenThread("listen://127.0.0.1:0");
if (error.Fail())
{
if (log)
Index: source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.h
===================================================================
--- source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.h
+++ source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.h
@@ -218,11 +218,8 @@
GetRemoteUnixSignals() override;
lldb::ProcessSP
- ConnectProcess (const char* connect_url,
- const char* plugin_name,
- lldb_private::Debugger &debugger,
- lldb_private::Target *target,
- lldb_private::Error &error) override;
+ ConnectProcess(const char *connect_url, const char *plugin_name, lldb_private::Debugger &debugger,
+ lldb_private::Target *target, lldb_private::Error &error, bool reverse = false) override;
virtual size_t
GetPendingGdbServerList(std::vector<std::string>& connection_urls);
Index: source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.cpp
===================================================================
--- source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.cpp
+++ source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.cpp
@@ -987,18 +987,16 @@
}
lldb::ProcessSP
-PlatformRemoteGDBServer::ConnectProcess(const char* connect_url,
- const char* plugin_name,
- lldb_private::Debugger &debugger,
- lldb_private::Target *target,
- lldb_private::Error &error)
+PlatformRemoteGDBServer::ConnectProcess(const char *connect_url, const char *plugin_name,
+ lldb_private::Debugger &debugger, lldb_private::Target *target,
+ lldb_private::Error &error, bool reverse)
{
if (!IsRemote() || !IsConnected())
{
error.SetErrorString("Not connected to remote gdb server");
return nullptr;
}
- return Platform::ConnectProcess(connect_url, plugin_name, debugger, target, error);
+ return Platform::ConnectProcess(connect_url, plugin_name, debugger, target, error, reverse);
}
size_t
Index: source/Plugins/Platform/POSIX/PlatformPOSIX.h
===================================================================
--- source/Plugins/Platform/POSIX/PlatformPOSIX.h
+++ source/Plugins/Platform/POSIX/PlatformPOSIX.h
@@ -183,12 +183,9 @@
UnloadImage (lldb_private::Process* process, uint32_t image_token) override;
lldb::ProcessSP
- ConnectProcess (const char* connect_url,
- const char* plugin_name,
- lldb_private::Debugger &debugger,
- lldb_private::Target *target,
- lldb_private::Error &error) override;
-
+ ConnectProcess(const char *connect_url, const char *plugin_name, lldb_private::Debugger &debugger,
+ lldb_private::Target *target, lldb_private::Error &error, bool reverse = false) override;
+
size_t
ConnectToWaitingProcesses(lldb_private::Debugger& debugger, lldb_private::Error& error) override;
Index: source/Plugins/Platform/POSIX/PlatformPOSIX.cpp
===================================================================
--- source/Plugins/Platform/POSIX/PlatformPOSIX.cpp
+++ source/Plugins/Platform/POSIX/PlatformPOSIX.cpp
@@ -984,23 +984,16 @@
process->ResetImageToken(image_token);
}
return Error();
-}
+}
lldb::ProcessSP
-PlatformPOSIX::ConnectProcess (const char* connect_url,
- const char* plugin_name,
- lldb_private::Debugger &debugger,
- lldb_private::Target *target,
- lldb_private::Error &error)
+PlatformPOSIX::ConnectProcess(const char *connect_url, const char *plugin_name, lldb_private::Debugger &debugger,
+ lldb_private::Target *target, lldb_private::Error &error, bool reverse)
{
if (m_remote_platform_sp)
- return m_remote_platform_sp->ConnectProcess(connect_url,
- plugin_name,
- debugger,
- target,
- error);
+ return m_remote_platform_sp->ConnectProcess(connect_url, plugin_name, debugger, target, error, reverse);
- return Platform::ConnectProcess(connect_url, plugin_name, debugger, target, error);
+ return Platform::ConnectProcess(connect_url, plugin_name, debugger, target, error, reverse);
}
const char*
Index: source/Plugins/Platform/Android/PlatformAndroidRemoteGDBServer.h
===================================================================
--- source/Plugins/Platform/Android/PlatformAndroidRemoteGDBServer.h
+++ source/Plugins/Platform/Android/PlatformAndroidRemoteGDBServer.h
@@ -40,11 +40,8 @@
DisconnectRemote () override;
lldb::ProcessSP
- ConnectProcess (const char* connect_url,
- const char* plugin_name,
- lldb_private::Debugger &debugger,
- lldb_private::Target *target,
- lldb_private::Error &error) override;
+ ConnectProcess(const char *connect_url, const char *plugin_name, lldb_private::Debugger &debugger,
+ lldb_private::Target *target, lldb_private::Error &error, bool reverse = false) override;
size_t
ConnectToWaitingProcesses(lldb_private::Debugger& debugger, lldb_private::Error& error) override;
Index: source/Plugins/Platform/Android/PlatformAndroidRemoteGDBServer.cpp
===================================================================
--- source/Plugins/Platform/Android/PlatformAndroidRemoteGDBServer.cpp
+++ source/Plugins/Platform/Android/PlatformAndroidRemoteGDBServer.cpp
@@ -225,11 +225,9 @@
}
lldb::ProcessSP
-PlatformAndroidRemoteGDBServer::ConnectProcess(const char* connect_url,
- const char* plugin_name,
- lldb_private::Debugger &debugger,
- lldb_private::Target *target,
- lldb_private::Error &error)
+PlatformAndroidRemoteGDBServer::ConnectProcess(const char *connect_url, const char *plugin_name,
+ lldb_private::Debugger &debugger, lldb_private::Target *target,
+ lldb_private::Error &error, bool reverse)
{
// We don't have the pid of the remote gdbserver when it isn't started by us but we still want
// to store the list of port forwards we set up in our port forward map. Generate a fake pid for
@@ -252,11 +250,8 @@
if (error.Fail())
return nullptr;
- return PlatformRemoteGDBServer::ConnectProcess(new_connect_url.c_str(),
- plugin_name,
- debugger,
- target,
- error);
+ return PlatformRemoteGDBServer::ConnectProcess(new_connect_url.c_str(), plugin_name, debugger, target, error,
+ reverse);
}
size_t
Index: source/Interpreter/CommandInterpreter.cpp
===================================================================
--- source/Interpreter/CommandInterpreter.cpp
+++ source/Interpreter/CommandInterpreter.cpp
@@ -624,18 +624,21 @@
}
}
- std::unique_ptr<CommandObjectRegexCommand>
- connect_gdb_remote_cmd_ap(new CommandObjectRegexCommand (*this,
- "gdb-remote",
- "Connect to a remote GDB server. If no hostname is provided, localhost is assumed.",
- "gdb-remote [<hostname>:]<portnum>",
- 2,
- 0,
- false));
+ std::unique_ptr<CommandObjectRegexCommand> connect_gdb_remote_cmd_ap(
+ new CommandObjectRegexCommand(*this, "gdb-remote", "Connect to a remote GDB server. If no "
+ "hostname is provided, localhost is assumed.",
+ "gdb-remote [<hostname>:]<portnum> [reverse]", 2, 0, false));
if (connect_gdb_remote_cmd_ap.get())
{
- if (connect_gdb_remote_cmd_ap->AddRegexCommand("^([^:]+:[[:digit:]]+)$", "process connect --plugin gdb-remote connect://%1") &&
- connect_gdb_remote_cmd_ap->AddRegexCommand("^([[:digit:]]+)$", "process connect --plugin gdb-remote connect://localhost:%1"))
+ if (connect_gdb_remote_cmd_ap->AddRegexCommand("^([^:]+:[[:digit:]]+)$",
+ "process connect --plugin gdb-remote connect://%1") &&
+ connect_gdb_remote_cmd_ap->AddRegexCommand("^([[:digit:]]+)$",
+ "process connect --plugin gdb-remote connect://localhost:%1") &&
+ connect_gdb_remote_cmd_ap->AddRegexCommand("^([^:]+:[[:digit:]]+) reverse$",
+ "process connect --plugin gdb-remote connect://%1 reverse") &&
+ connect_gdb_remote_cmd_ap->AddRegexCommand("^([[:digit:]]+) reverse$",
+ "process connect --plugin gdb-remote "
+ "connect://localhost:%1 reverse"))
{
CommandObjectSP command_sp(connect_gdb_remote_cmd_ap.release());
m_command_dict[command_sp->GetCommandName ()] = command_sp;
Index: source/Commands/CommandObjectProcess.cpp
===================================================================
--- source/Commands/CommandObjectProcess.cpp
+++ source/Commands/CommandObjectProcess.cpp
@@ -1027,16 +1027,13 @@
std::string plugin_name;
};
- CommandObjectProcessConnect (CommandInterpreter &interpreter) :
- CommandObjectParsed (interpreter,
- "process connect",
- "Connect to a remote debug service.",
- "process connect <remote-url>",
- 0),
- m_options (interpreter)
+ CommandObjectProcessConnect(CommandInterpreter &interpreter)
+ : CommandObjectParsed(interpreter, "process connect", "Connect to a remote debug service.",
+ "process connect <remote-url> [reverse]", 0),
+ m_options(interpreter)
{
}
-
+
~CommandObjectProcessConnect () override
{
}
@@ -1052,23 +1049,39 @@
bool
DoExecute (Args& command, CommandReturnObject &result) override
{
+ bool reverse_connect = false;
if (command.GetArgumentCount() != 1)
{
- result.AppendErrorWithFormat ("'%s' takes exactly one argument:\nUsage: %s\n",
- m_cmd_name.c_str(),
- m_cmd_syntax.c_str());
- result.SetStatus (eReturnStatusFailed);
- return false;
+ if (command.GetArgumentCount() != 2)
+ {
+ result.AppendErrorWithFormat("'%s' takes either 1 or 2 arguments:\nUsage: %s\n", m_cmd_name.c_str(),
+ m_cmd_syntax.c_str());
+ result.SetStatus(eReturnStatusFailed);
+ return false;
+ }
+
+ if (strcmp(command.GetArgumentAtIndex(1), "reverse"))
+ {
+ result.AppendErrorWithFormat("Invalid arguments for '%s'.\nUsage: %s\n", m_cmd_name.c_str(),
+ m_cmd_syntax.c_str());
+ result.SetStatus(eReturnStatusFailed);
+ return false;
+ }
+
+ reverse_connect = true;
}
-
- Process *process = m_exe_ctx.GetProcessPtr();
- if (process && process->IsAlive())
+ if (!reverse_connect)
{
- result.AppendErrorWithFormat ("Process %" PRIu64 " is currently being debugged, kill the process before connecting.\n",
- process->GetID());
- result.SetStatus (eReturnStatusFailed);
- return false;
+ Process *process = m_exe_ctx.GetProcessPtr();
+ if (process && process->IsAlive())
+ {
+ result.AppendErrorWithFormat("Process %" PRIu64 " is currently being debugged, kill "
+ "the process before connecting.\n",
+ process->GetID());
+ result.SetStatus(eReturnStatusFailed);
+ return false;
+ }
}
const char *plugin_name = nullptr;
@@ -1078,11 +1091,8 @@
Error error;
Debugger& debugger = m_interpreter.GetDebugger();
PlatformSP platform_sp = m_interpreter.GetPlatform(true);
- ProcessSP process_sp = platform_sp->ConnectProcess(command.GetArgumentAtIndex(0),
- plugin_name,
- debugger,
- debugger.GetSelectedTarget().get(),
- error);
+ ProcessSP process_sp = platform_sp->ConnectProcess(command.GetArgumentAtIndex(0), plugin_name, debugger,
+ debugger.GetSelectedTarget().get(), error, reverse_connect);
if (error.Fail() || process_sp == nullptr)
{
result.AppendError(error.AsCString("Error connecting to the process"));
Index: include/lldb/Target/Process.h
===================================================================
--- include/lldb/Target/Process.h
+++ include/lldb/Target/Process.h
@@ -1209,7 +1209,7 @@
/// Returns an error object.
//------------------------------------------------------------------
virtual Error
- ConnectRemote (Stream *strm, const char *remote_url);
+ ConnectRemote(Stream *strm, const char *remote_url, bool reverse = false);
bool
GetShouldDetach () const
@@ -1461,7 +1461,7 @@
/// Returns an error object.
//------------------------------------------------------------------
virtual Error
- DoConnectRemote (Stream *strm, const char *remote_url)
+ DoConnectRemote(Stream *strm, const char *remote_url, bool reverse = false)
{
Error error;
error.SetErrorString ("remote connections are not supported");
Index: include/lldb/Target/Platform.h
===================================================================
--- include/lldb/Target/Platform.h
+++ include/lldb/Target/Platform.h
@@ -488,11 +488,8 @@
Error &error);
virtual lldb::ProcessSP
- ConnectProcess (const char* connect_url,
- const char* plugin_name,
- lldb_private::Debugger &debugger,
- lldb_private::Target *target,
- lldb_private::Error &error);
+ ConnectProcess(const char *connect_url, const char *plugin_name, lldb_private::Debugger &debugger,
+ lldb_private::Target *target, lldb_private::Error &error, bool reverse = false);
//------------------------------------------------------------------
/// Attach to an existing process using a process ID.
_______________________________________________
lldb-commits mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits