fjricci updated this revision to Diff 47681.
fjricci added a comment.
Refactor to use listen urls
http://reviews.llvm.org/D17099
Files:
source/Interpreter/CommandInterpreter.cpp
source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp
source/Plugins/Process/gdb-remote/GDBRemoteCommunication.h
source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
Index: source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
===================================================================
--- source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
+++ source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
@@ -723,10 +723,28 @@
if (error.Fail())
return error;
- error = ConnectToDebugserver (remote_url);
+ if (strncmp(remote_url, "listen", strlen("listen")) == 0)
+ {
+ error = m_gdb_comm.WaitForDebugserver(remote_url);
+ if (error.Fail())
+ return error;
- if (error.Fail())
+ error = ConnectToDebugserver(nullptr);
+ if (error.Fail())
+ return error;
+ }
+ else if (strncmp(remote_url, "connect", strlen("connect")) == 0)
+ {
+ error = ConnectToDebugserver(remote_url);
+ if (error.Fail())
+ return error;
+ }
+ else
+ {
+ error.SetErrorStringWithFormat ("Invalid connection url: %s", remote_url);
return error;
+ }
+
StartAsyncThread ();
lldb::pid_t pid = m_gdb_comm.GetCurrentProcessID ();
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,37 @@
}
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>");
+
+ error = StartListenThread(url);
+ 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 +1279,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/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 listen://%1") &&
+ connect_gdb_remote_cmd_ap->AddRegexCommand("^([[:digit:]]+) reverse$",
+ "process connect --plugin gdb-remote "
+ "listen://localhost:%1"))
{
CommandObjectSP command_sp(connect_gdb_remote_cmd_ap.release());
m_command_dict[command_sp->GetCommandName ()] = command_sp;
_______________________________________________
lldb-commits mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits