| """ | |
| Test inferior restart when breakpoint is set on running target. | |
| """ | |
| import lldb | |
| from lldbsuite.test.decorators import * | |
| from lldbsuite.test.lldbtest import * | |
| class BreakpointSetRestart(TestBase): | |
| BREAKPOINT_TEXT = "Set a breakpoint here" | |
| @skipIfNetBSD | |
| @skipIf(oslist=["freebsd"], bugnumber="github.com/llvm/llvm-project/issues/56082") | |
| def test_breakpoint_set_restart(self): | |
| self.build() | |
| exe = self.getBuildArtifact("a.out") | |
| target = self.dbg.CreateTarget(exe) | |
| self.assertTrue(target, VALID_TARGET) | |
| self.dbg.SetAsync(True) | |
| process = target.LaunchSimple(None, None, self.get_process_working_directory()) | |
| self.assertTrue(process, PROCESS_IS_VALID) | |
| event = lldb.SBEvent() | |
| # Wait for inferior to transition to running state | |
| while self.dbg.GetListener().WaitForEvent(2, event): | |
| if lldb.SBProcess.GetStateFromEvent(event) == lldb.eStateRunning: | |
| break | |
| bp = target.BreakpointCreateBySourceRegex( | |
| self.BREAKPOINT_TEXT, lldb.SBFileSpec("main.cpp") | |
| ) | |
| self.assertTrue(bp.IsValid(), VALID_BREAKPOINT) | |
| self.assertEqual(bp.GetNumLocations(), 1, VALID_BREAKPOINT) | |
| while self.dbg.GetListener().WaitForEvent(2, event): | |
| if lldb.SBProcess.GetStateFromEvent( | |
| event | |
| ) == lldb.eStateStopped and lldb.SBProcess.GetRestartedFromEvent(event): | |
| continue | |
| if lldb.SBProcess.GetStateFromEvent(event) == lldb.eStateRunning: | |
| continue | |
| self.fail( | |
| "Setting a breakpoint generated an unexpected event: %s" | |
| % lldb.SBDebugger.StateAsCString( | |
| lldb.SBProcess.GetStateFromEvent(event) | |
| ) | |
| ) |