| 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) |