199451b44SJordan Rupprechtimport lldb 299451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 399451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 433c0f93fSPavel Labathfrom lldbsuite.test.gdbclientutils import * 533c0f93fSPavel Labathfrom lldbsuite.test.lldbgdbclient import GDBRemoteTestBase 699451b44SJordan Rupprecht 799451b44SJordan Rupprecht 899451b44SJordan Rupprechtclass TestRestartBug(GDBRemoteTestBase): 999451b44SJordan Rupprecht @expectedFailureAll(bugnumber="llvm.org/pr24530") 1099451b44SJordan Rupprecht def test(self): 1199451b44SJordan Rupprecht """ 1299451b44SJordan Rupprecht Test auto-continue behavior when a process is interrupted to deliver 1399451b44SJordan Rupprecht an "asynchronous" packet. This simulates the situation when a process 1499451b44SJordan Rupprecht stops on its own just as lldb client is about to interrupt it. The 1599451b44SJordan Rupprecht client should not auto-continue in this case, unless the user has 1699451b44SJordan Rupprecht explicitly requested that we ignore signals of this type. 1799451b44SJordan Rupprecht """ 18*2238dcc3SJonas Devlieghere 1999451b44SJordan Rupprecht class MyResponder(MockGDBServerResponder): 2099451b44SJordan Rupprecht continueCount = 0 2199451b44SJordan Rupprecht 2299451b44SJordan Rupprecht def setBreakpoint(self, packet): 2399451b44SJordan Rupprecht return "OK" 2499451b44SJordan Rupprecht 2599451b44SJordan Rupprecht def interrupt(self): 2699451b44SJordan Rupprecht # Simulate process stopping due to a raise(SIGINT) just as lldb 2799451b44SJordan Rupprecht # is about to interrupt it. 2899451b44SJordan Rupprecht return "T02reason:signal" 2999451b44SJordan Rupprecht 3099451b44SJordan Rupprecht def cont(self): 3199451b44SJordan Rupprecht self.continueCount += 1 3299451b44SJordan Rupprecht if self.continueCount == 1: 3399451b44SJordan Rupprecht # No response, wait for the client to interrupt us. 3499451b44SJordan Rupprecht return None 3599451b44SJordan Rupprecht return "W00" # Exit 3699451b44SJordan Rupprecht 3799451b44SJordan Rupprecht self.server.responder = MyResponder() 3899451b44SJordan Rupprecht target = self.createTarget("a.yaml") 3999451b44SJordan Rupprecht process = self.connect(target) 4099451b44SJordan Rupprecht self.dbg.SetAsync(True) 4199451b44SJordan Rupprecht process.Continue() 4299451b44SJordan Rupprecht 4399451b44SJordan Rupprecht # resume the process and immediately try to set another breakpoint. When using the remote 4499451b44SJordan Rupprecht # stub, this will trigger a request to stop the process. Make sure we 4599451b44SJordan Rupprecht # do not lose this signal. 4699451b44SJordan Rupprecht bkpt = target.BreakpointCreateByAddress(0x1234) 4799451b44SJordan Rupprecht self.assertTrue(bkpt.IsValid()) 4899451b44SJordan Rupprecht self.assertEqual(bkpt.GetNumLocations(), 1) 4999451b44SJordan Rupprecht 5099451b44SJordan Rupprecht event = lldb.SBEvent() 5199451b44SJordan Rupprecht while self.dbg.GetListener().WaitForEvent(2, event): 5299451b44SJordan Rupprecht if self.TraceOn(): 53*2238dcc3SJonas Devlieghere print( 54*2238dcc3SJonas Devlieghere "Process changing state to:", 55*2238dcc3SJonas Devlieghere self.dbg.StateAsCString(process.GetStateFromEvent(event)), 56*2238dcc3SJonas Devlieghere ) 5799451b44SJordan Rupprecht if process.GetStateFromEvent(event) == lldb.eStateExited: 5899451b44SJordan Rupprecht break 5999451b44SJordan Rupprecht 6099451b44SJordan Rupprecht # We should get only one continue packet as the client should not 6199451b44SJordan Rupprecht # auto-continue after setting the breakpoint. 6299451b44SJordan Rupprecht self.assertEqual(self.server.responder.continueCount, 1) 6399451b44SJordan Rupprecht # And the process should end up in the stopped state. 6447c4c6a7SDave Lee self.assertState(process.GetState(), lldb.eStateStopped) 65