xref: /llvm-project/lldb/test/API/functionalities/gdb_remote_client/TestRestartBug.py (revision 2238dcc39358353cac21df75c3c3286ab20b8f53)
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