1import lldb 2import time 3from lldbsuite.test.lldbtest import * 4from lldbsuite.test.decorators import * 5from lldbsuite.test.gdbclientutils import * 6from lldbsuite.test.lldbgdbclient import GDBRemoteTestBase 7 8class TestPlatformKill(GDBRemoteTestBase): 9 10 mydir = TestBase.compute_mydir(__file__) 11 12 @skipIfRemote 13 @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr52451") 14 def test_kill_different_platform(self): 15 """Test connecting to a remote linux platform""" 16 17 self.build(dictionary={"CXX_SOURCES":"sleep.cpp"}) 18 host_process = self.spawnSubprocess(self.getBuildArtifact()) 19 20 # Create a fake remote process with the same PID as host_process 21 class MyResponder(MockGDBServerResponder): 22 def __init__(self): 23 MockGDBServerResponder.__init__(self) 24 self.got_kill = False 25 26 def qC(self): 27 return "QC%x"%host_process.pid 28 29 def k(self): 30 self.got_kill = True 31 return "X09" 32 33 self.server.responder = MyResponder() 34 35 error = lldb.SBError() 36 target = self.dbg.CreateTarget("", "x86_64-pc-linux", "remote-linux", 37 False, error) 38 self.assertSuccess(error) 39 process = self.connect(target) 40 self.assertEqual(process.GetProcessID(), host_process.pid) 41 42 host_platform = lldb.SBPlatform("host") 43 self.assertSuccess(host_platform.Kill(host_process.pid)) 44 45 # Host dies, remote process lives. 46 self.assertFalse(self.server.responder.got_kill) 47 self.assertIsNotNone(host_process.wait(timeout=10)) 48 49 # Now kill the remote one as well 50 self.assertSuccess(process.Kill()) 51 self.assertTrue(self.server.responder.got_kill) 52