1from __future__ import print_function 2import lldb 3import unittest 4from lldbsuite.test.lldbtest import * 5from lldbsuite.test.decorators import * 6from gdbclientutils import * 7 8 9class TestMultiprocess(GDBRemoteTestBase): 10 def base_test(self, variant): 11 class MyResponder(MockGDBServerResponder): 12 def __init__(self): 13 super().__init__() 14 self.first = True 15 self.detached = None 16 self.property = "{}-events+".format(variant) 17 18 def qSupported(self, client_supported): 19 assert "multiprocess+" in client_supported 20 assert self.property in client_supported 21 return "{};multiprocess+;{}".format( 22 super().qSupported(client_supported), self.property) 23 24 def qfThreadInfo(self): 25 return "mp400.10200" 26 27 def cont(self): 28 if self.first: 29 self.first = False 30 return ("T0fthread:p400.10200;reason:{0};{0}:p401.10400;" 31 .format(variant)) 32 return "W00" 33 34 def D(self, packet): 35 self.detached = packet 36 return "OK" 37 38 self.server.responder = MyResponder() 39 target = self.dbg.CreateTarget('') 40 if self.TraceOn(): 41 self.runCmd("log enable gdb-remote packets") 42 self.addTearDownHook( 43 lambda: self.runCmd("log disable gdb-remote packets")) 44 process = self.connect(target) 45 process.Continue() 46 self.assertRegex(self.server.responder.detached, r"D;0*401") 47 48 def test_fork(self): 49 self.base_test("fork") 50 51 def test_vfork(self): 52 self.base_test("vfork") 53