| import lldb |
| import unittest |
| from lldbsuite.test.lldbtest import * |
| from lldbsuite.test.decorators import * |
| from lldbsuite.test.gdbclientutils import * |
| from lldbsuite.test.lldbgdbclient import GDBRemoteTestBase |
| |
| |
| class TestMultiprocess(GDBRemoteTestBase): |
| def base_test(self, variant, follow_child=False): |
| class MyResponder(MockGDBServerResponder): |
| def __init__(self): |
| super().__init__() |
| self.first = True |
| self.detached = None |
| self.property = "{}-events+".format(variant) |
| |
| def qSupported(self, client_supported): |
| assert "multiprocess+" in client_supported |
| assert self.property in client_supported |
| return "{};multiprocess+;{}".format( |
| super().qSupported(client_supported), self.property |
| ) |
| |
| def qfThreadInfo(self): |
| return "mp400.10200" |
| |
| def cont(self): |
| if self.first: |
| self.first = False |
| return "T0fthread:p400.10200;reason:{0};{0}:p401.10400;".format( |
| variant |
| ) |
| return "W00" |
| |
| def D(self, packet): |
| self.detached = packet |
| return "OK" |
| |
| self.server.responder = MyResponder() |
| target = self.dbg.CreateTarget("") |
| if self.TraceOn(): |
| self.runCmd("log enable gdb-remote packets") |
| self.addTearDownHook(lambda: self.runCmd("log disable gdb-remote packets")) |
| if follow_child: |
| self.runCmd("settings set target.process.follow-fork-mode child") |
| process = self.connect(target) |
| self.assertEqual(process.GetProcessID(), 1024) |
| process.Continue() |
| self.assertRegex( |
| self.server.responder.detached, r"D;0*400" if follow_child else r"D;0*401" |
| ) |
| self.assertEqual(process.GetProcessID(), 1025 if follow_child else 1024) |
| |
| def test_fork(self): |
| self.base_test("fork") |
| |
| def test_vfork(self): |
| self.base_test("vfork") |
| |
| def test_fork_follow_child(self): |
| self.base_test("fork", follow_child=True) |
| |
| def test_vfork_follow_child(self): |
| self.base_test("vfork", follow_child=True) |