1import socket 2import gdbremote_testcase 3import lldbgdbserverutils 4from lldbsuite.test.decorators import * 5from lldbsuite.test.lldbtest import * 6from lldbsuite.test import lldbutil 7 8 9class TestPlatformProcessConnect(TestBase): 10 NO_DEBUG_INFO_TESTCASE = True 11 12 @skipIfRemote 13 @expectedFailureAll(hostoslist=["windows"], triple=".*-android") 14 @skipIfDarwin # lldb-server not found correctly 15 @expectedFailureAll(oslist=["windows"]) # process modules not loaded 16 # lldb-server platform times out waiting for the gdbserver port number to be 17 # written to the pipe, yet it seems the gdbserver already has written it. 18 @expectedFailureAll( 19 archs=["aarch64"], 20 oslist=["freebsd"], 21 bugnumber="https://github.com/llvm/llvm-project/issues/84327", 22 ) 23 @add_test_categories(["lldb-server"]) 24 def test_platform_process_connect(self): 25 self.build() 26 27 hostname = socket.getaddrinfo("localhost", 0, proto=socket.IPPROTO_TCP)[0][4][0] 28 listen_url = "[%s]:0" % hostname 29 30 port_file = self.getBuildArtifact("port") 31 commandline_args = [ 32 "platform", 33 "--listen", 34 listen_url, 35 "--socket-file", 36 port_file, 37 "--", 38 self.getBuildArtifact("a.out"), 39 "foo", 40 ] 41 self.spawnSubprocess(lldbgdbserverutils.get_lldb_server_exe(), commandline_args) 42 43 socket_id = lldbutil.wait_for_file_on_target(self, port_file) 44 45 new_platform = lldb.SBPlatform("remote-" + self.getPlatform()) 46 self.dbg.SetSelectedPlatform(new_platform) 47 48 connect_url = "connect://[%s]:%s" % (hostname, socket_id) 49 self.runCmd("platform connect %s" % connect_url) 50 51 lldbutil.run_break_set_by_symbol(self, "main") 52 process = self.process() 53 54 process.Continue() 55 56 frame = self.frame() 57 self.assertEqual(frame.GetFunction().GetName(), "main") 58 self.assertEqual(frame.FindVariable("argc").GetValueAsSigned(), 2) 59 process.Continue() 60