| import lldb | |
| import binascii | |
| import os | |
| from lldbsuite.test.lldbtest import * | |
| from lldbsuite.test.decorators import * | |
| from lldbsuite.test.gdbclientutils import * | |
| from lldbsuite.test.lldbgdbclient import GDBRemoteTestBase | |
| @skipIfRemote | |
| class TestProcessConnect(GDBRemoteTestBase): | |
| NO_DEBUG_INFO_TESTCASE = True | |
| def test_gdb_remote_sync(self): | |
| """Test the gdb-remote command in synchronous mode""" | |
| try: | |
| self.dbg.SetAsync(False) | |
| self.expect( | |
| "gdb-remote " + self.server.get_connect_address(), | |
| substrs=["Process", "stopped"], | |
| ) | |
| finally: | |
| self.dbg.GetSelectedTarget().GetProcess().Kill() | |
| def test_gdb_remote_async(self): | |
| """Test the gdb-remote command in asynchronous mode""" | |
| try: | |
| self.dbg.SetAsync(True) | |
| self.expect( | |
| "gdb-remote " + self.server.get_connect_address(), | |
| matching=False, | |
| substrs=["Process", "stopped"], | |
| ) | |
| lldbutil.expect_state_changes( | |
| self, self.dbg.GetListener(), self.process(), [lldb.eStateStopped] | |
| ) | |
| finally: | |
| self.dbg.GetSelectedTarget().GetProcess().Kill() | |
| lldbutil.expect_state_changes( | |
| self, self.dbg.GetListener(), self.process(), [lldb.eStateExited] | |
| ) | |
| @skipIfWindows | |
| def test_process_connect_sync(self): | |
| """Test the gdb-remote command in synchronous mode""" | |
| try: | |
| self.dbg.SetAsync(False) | |
| self.expect( | |
| "platform select remote-gdb-server", | |
| substrs=["Platform: remote-gdb-server", "Connected: no"], | |
| ) | |
| self.expect( | |
| "process connect " + self.server.get_connect_url(), | |
| substrs=["Process", "stopped"], | |
| ) | |
| finally: | |
| self.dbg.GetSelectedTarget().GetProcess().Kill() | |
| @skipIfWindows | |
| def test_process_connect_async(self): | |
| """Test the gdb-remote command in asynchronous mode""" | |
| try: | |
| self.dbg.SetAsync(True) | |
| self.expect( | |
| "platform select remote-gdb-server", | |
| substrs=["Platform: remote-gdb-server", "Connected: no"], | |
| ) | |
| self.expect( | |
| "process connect " + self.server.get_connect_url(), | |
| matching=False, | |
| substrs=["Process", "stopped"], | |
| ) | |
| lldbutil.expect_state_changes( | |
| self, self.dbg.GetListener(), self.process(), [lldb.eStateStopped] | |
| ) | |
| finally: | |
| self.dbg.GetSelectedTarget().GetProcess().Kill() | |
| lldbutil.expect_state_changes( | |
| self, self.dbg.GetListener(), self.process(), [lldb.eStateExited] | |
| ) | |
| def test_breakpoint_count(self): | |
| """ | |
| Test that breakpoint count gets reset for each new connection. | |
| """ | |
| class MyResponder(MockGDBServerResponder): | |
| def __init__(self): | |
| super().__init__() | |
| self.continued = False | |
| def qfThreadInfo(self): | |
| return "m47" | |
| def qsThreadInfo(self): | |
| return "l" | |
| def setBreakpoint(self, packet): | |
| return "OK" | |
| def readRegister(self, reg): | |
| # Pretend we're at the breakpoint after we've been resumed. | |
| return "3412000000000000" if self.continued else "4747000000000000" | |
| def cont(self): | |
| self.continued = True | |
| return "T05thread=47;reason:breakpoint" | |
| # Connect to the first process and set our breakpoint. | |
| self.server.responder = MyResponder() | |
| target = self.createTarget("a.yaml") | |
| process = self.connect(target) | |
| bkpt = target.BreakpointCreateByAddress(0x1234) | |
| self.assertTrue(bkpt.IsValid()) | |
| self.assertEqual(bkpt.GetNumLocations(), 1) | |
| # "continue" the process. It should hit our breakpoint. | |
| process.Continue() | |
| self.assertState(process.GetState(), lldb.eStateStopped) | |
| self.assertEqual(bkpt.GetHitCount(), 1) | |
| # Now kill it. The breakpoint should still show a hit count of one. | |
| process.Kill() | |
| self.server.stop() | |
| self.assertEqual(bkpt.GetHitCount(), 1) | |
| # Start over, and reconnect. | |
| self.server = MockGDBServer(self.server_socket_class()) | |
| self.server.start() | |
| process = self.connect(target) | |
| # The hit count should be reset. | |
| self.assertEqual(bkpt.GetHitCount(), 0) |