Skip to content

Commit 1cb906e

Browse files
authored
Minor fix to connect-url to support unix-connect sockets on localhost (#142875)
**Summary:** when the unix-socket connections on localhost are used to for platform connect i.e. `platform connect unix-connect:///path/to/socket.sock` then `PlatformRemoteGDBServer.m_platform_hostname` is empty. Based on the current logic, for the process attach, when the connection param returned by platform server as qLaunchGDBServer is this `socket_name:/path/to/processgdbserver.sock` then the subsequent connect url for the process url looks like this `unix-connect://[]/path/to/processgdbserver.sock` and the connection fail. This change is only adding the braces when the hostname is not empty. **Test Plan:** Added unittest and existing tests pass. ``` satyajanga@devvm21837:toolchain $ LLDB_COMMAND_TRACE=YES ./bin/llvm-lit --verbose ~/llvm-sand/external/llvm-project/lldb/test/API/commands/platform -- Testing: 9 tests, 9 workers -- UNSUPPORTED: lldb-api :: commands/platform/sdk/TestPlatformSDK.py (1 of 9) PASS: lldb-api :: commands/platform/file/read/TestPlatformFileRead.py (2 of 9) PASS: lldb-api :: commands/platform/file/close/TestPlatformFileClose.py (3 of 9) PASS: lldb-api :: commands/platform/basic/TestPlatformPython.py (4 of 9) PASS: lldb-api :: commands/platform/basic/TestPlatformCommand.py (5 of 9) PASS: lldb-api :: commands/platform/process/launch/TestPlatformProcessLaunch.py (6 of 9) PASS: lldb-api :: commands/platform/connect/TestPlatformConnect.py (7 of 9) PASS: lldb-api :: commands/platform/launchgdbserver/TestPlatformLaunchGDBServer.py (8 of 9) PASS: lldb-api :: commands/platform/process/list/TestProcessList.py (9 of 9) Testing Time: 13.24s Total Discovered Tests: 9 Unsupported: 1 (11.11%) Passed : 8 (88.89%) satyajanga@devvm21837:toolchain $ ``` Reviewers: @clayborg @Jlalond Subscribers: Tasks: Tags:
1 parent d502c68 commit 1cb906e

File tree

2 files changed

+49
-1
lines changed

2 files changed

+49
-1
lines changed

lldb/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -800,7 +800,10 @@ std::string PlatformRemoteGDBServer::MakeUrl(const char *scheme,
800800
const char *hostname,
801801
uint16_t port, const char *path) {
802802
StreamString result;
803-
result.Printf("%s://[%s]", scheme, hostname);
803+
result.Printf("%s://", scheme);
804+
if (strlen(hostname) > 0)
805+
result.Printf("[%s]", hostname);
806+
804807
if (port != 0)
805808
result.Printf(":%u", port);
806809
if (path)

lldb/test/API/commands/platform/connect/TestPlatformConnect.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,3 +57,48 @@ def test_platform_process_connect(self):
5757
self.assertEqual(frame.GetFunction().GetName(), "main")
5858
self.assertEqual(frame.FindVariable("argc").GetValueAsSigned(), 2)
5959
process.Continue()
60+
61+
@skipIfRemote
62+
@expectedFailureAll(hostoslist=["windows"], triple=".*-android")
63+
@skipIfDarwin # lldb-server not found correctly
64+
@expectedFailureAll(oslist=["windows"]) # process modules not loaded
65+
# lldb-server platform times out waiting for the gdbserver port number to be
66+
# written to the pipe, yet it seems the gdbserver already has written it.
67+
@expectedFailureAll(
68+
archs=["aarch64"],
69+
oslist=["freebsd"],
70+
bugnumber="https://github.com/llvm/llvm-project/issues/84327",
71+
)
72+
@add_test_categories(["lldb-server"])
73+
def test_platform_process_connect_with_unix_connect(self):
74+
self.build()
75+
lldb_temp_dir = lldb.SBHostOS.GetLLDBPath(lldb.ePathTypeLLDBTempSystemDir)
76+
named_pipe = "%s/platform_server.sock" % lldb_temp_dir
77+
port_file = self.getBuildArtifact("port")
78+
commandline_args = [
79+
"platform",
80+
"--listen",
81+
named_pipe,
82+
"--socket-file",
83+
port_file,
84+
"--",
85+
self.getBuildArtifact("a.out"),
86+
"foo",
87+
]
88+
self.spawnSubprocess(lldbgdbserverutils.get_lldb_server_exe(), commandline_args)
89+
90+
socket_file = lldbutil.wait_for_file_on_target(self, port_file)
91+
new_platform = lldb.SBPlatform("remote-" + self.getPlatform())
92+
self.dbg.SetSelectedPlatform(new_platform)
93+
connect_url = "unix-connect://%s" % socket_file
94+
self.runCmd("platform connect %s" % connect_url)
95+
96+
lldbutil.run_break_set_by_symbol(self, "main")
97+
process = self.process()
98+
99+
process.Continue()
100+
101+
frame = self.frame()
102+
self.assertEqual(frame.GetFunction().GetName(), "main")
103+
self.assertEqual(frame.FindVariable("argc").GetValueAsSigned(), 2)
104+
process.Continue()

0 commit comments

Comments
 (0)