136 lines · python
1import lldb2import binascii3import os4from lldbsuite.test.lldbtest import *5from lldbsuite.test.decorators import *6from lldbsuite.test.gdbclientutils import *7from lldbsuite.test.lldbgdbclient import GDBRemoteTestBase8 9 10@skipIfRemote11class TestProcessConnect(GDBRemoteTestBase):12 NO_DEBUG_INFO_TESTCASE = True13 14 def test_gdb_remote_sync(self):15 """Test the gdb-remote command in synchronous mode"""16 try:17 self.dbg.SetAsync(False)18 self.expect(19 "gdb-remote " + self.server.get_connect_address(),20 substrs=["Process", "stopped"],21 )22 finally:23 self.dbg.GetSelectedTarget().GetProcess().Kill()24 25 def test_gdb_remote_async(self):26 """Test the gdb-remote command in asynchronous mode"""27 try:28 self.dbg.SetAsync(True)29 self.expect(30 "gdb-remote " + self.server.get_connect_address(),31 matching=False,32 substrs=["Process", "stopped"],33 )34 lldbutil.expect_state_changes(35 self, self.dbg.GetListener(), self.process(), [lldb.eStateStopped]36 )37 finally:38 self.dbg.GetSelectedTarget().GetProcess().Kill()39 lldbutil.expect_state_changes(40 self, self.dbg.GetListener(), self.process(), [lldb.eStateExited]41 )42 43 @skipIfWindows44 def test_process_connect_sync(self):45 """Test the gdb-remote command in synchronous mode"""46 try:47 self.dbg.SetAsync(False)48 self.expect(49 "platform select remote-gdb-server",50 substrs=["Platform: remote-gdb-server", "Connected: no"],51 )52 self.expect(53 "process connect " + self.server.get_connect_url(),54 substrs=["Process", "stopped"],55 )56 finally:57 self.dbg.GetSelectedTarget().GetProcess().Kill()58 59 @skipIfWindows60 def test_process_connect_async(self):61 """Test the gdb-remote command in asynchronous mode"""62 try:63 self.dbg.SetAsync(True)64 self.expect(65 "platform select remote-gdb-server",66 substrs=["Platform: remote-gdb-server", "Connected: no"],67 )68 self.expect(69 "process connect " + self.server.get_connect_url(),70 matching=False,71 substrs=["Process", "stopped"],72 )73 lldbutil.expect_state_changes(74 self, self.dbg.GetListener(), self.process(), [lldb.eStateStopped]75 )76 finally:77 self.dbg.GetSelectedTarget().GetProcess().Kill()78 lldbutil.expect_state_changes(79 self, self.dbg.GetListener(), self.process(), [lldb.eStateExited]80 )81 82 def test_breakpoint_count(self):83 """84 Test that breakpoint count gets reset for each new connection.85 """86 87 class MyResponder(MockGDBServerResponder):88 def __init__(self):89 super().__init__()90 self.continued = False91 92 def qfThreadInfo(self):93 return "m47"94 95 def qsThreadInfo(self):96 return "l"97 98 def setBreakpoint(self, packet):99 return "OK"100 101 def readRegister(self, reg):102 # Pretend we're at the breakpoint after we've been resumed.103 return "3412000000000000" if self.continued else "4747000000000000"104 105 def cont(self):106 self.continued = True107 return "T05thread=47;reason:breakpoint"108 109 # Connect to the first process and set our breakpoint.110 self.server.responder = MyResponder()111 target = self.createTarget("a.yaml")112 process = self.connect(target)113 114 bkpt = target.BreakpointCreateByAddress(0x1234)115 self.assertTrue(bkpt.IsValid())116 self.assertEqual(bkpt.GetNumLocations(), 1)117 118 # "continue" the process. It should hit our breakpoint.119 process.Continue()120 self.assertState(process.GetState(), lldb.eStateStopped)121 self.assertEqual(bkpt.GetHitCount(), 1)122 123 # Now kill it. The breakpoint should still show a hit count of one.124 process.Kill()125 self.server.stop()126 self.assertEqual(bkpt.GetHitCount(), 1)127 128 # Start over, and reconnect.129 self.server = MockGDBServer(self.server_socket_class())130 self.server.start()131 132 process = self.connect(target)133 134 # The hit count should be reset.135 self.assertEqual(bkpt.GetHitCount(), 0)136