brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.6 KiB · 47cbc41 Raw
108 lines · python
1"""2Test that the breakpoint auto-continue flag works correctly.3"""4 5 6import lldb7import lldbsuite.test.lldbutil as lldbutil8from lldbsuite.test.lldbtest import *9 10 11class BreakpointAutoContinue(TestBase):12    NO_DEBUG_INFO_TESTCASE = True13 14    def test_breakpoint_auto_continue(self):15        """Make sure the auto continue continues with no other complications"""16        self.build()17        self.simple_auto_continue()18 19    def test_auto_continue_with_command(self):20        """Add a command, make sure the command gets run"""21        self.build()22        self.auto_continue_with_command()23 24    def test_auto_continue_on_location(self):25        """Set auto-continue on a location and make sure only that location continues"""26        self.build()27        self.auto_continue_location()28 29    def make_target_and_bkpt(30        self,31        additional_options=None,32        num_expected_loc=1,33        pattern="Set a breakpoint here",34    ):35        self.target = self.createTestTarget()36 37        extra_options_txt = "--auto-continue 1 "38        if additional_options:39            extra_options_txt += additional_options40        bpno = lldbutil.run_break_set_by_source_regexp(41            self,42            pattern,43            extra_options=extra_options_txt,44            num_expected_locations=num_expected_loc,45        )46        return bpno47 48    def launch_it(self, expected_state):49        error = lldb.SBError()50        launch_info = self.target.GetLaunchInfo()51        launch_info.SetWorkingDirectory(self.get_process_working_directory())52 53        process = self.target.Launch(launch_info, error)54        self.assertSuccess(error, "Launch failed.")55 56        state = process.GetState()57        self.assertEqual(state, expected_state, "Didn't get expected state")58 59        return process60 61    def simple_auto_continue(self):62        bpno = self.make_target_and_bkpt()63        process = self.launch_it(lldb.eStateExited)64 65        bkpt = self.target.FindBreakpointByID(bpno)66        self.assertEqual(67            bkpt.GetHitCount(), 2, "Should have run through the breakpoint twice"68        )69 70    def auto_continue_with_command(self):71        bpno = self.make_target_and_bkpt(72            "-N BKPT -C 'break modify --auto-continue 0 BKPT'"73        )74        process = self.launch_it(lldb.eStateStopped)75        state = process.GetState()76        self.assertState(state, lldb.eStateStopped, "Process should be stopped")77        bkpt = self.target.FindBreakpointByID(bpno)78        threads = lldbutil.get_threads_stopped_at_breakpoint(process, bkpt)79        self.assertEqual(80            len(threads), 1, "There was a thread stopped at our breakpoint"81        )82        self.assertEqual(bkpt.GetHitCount(), 2, "Should have hit the breakpoint twice")83 84    def auto_continue_location(self):85        bpno = self.make_target_and_bkpt(86            pattern="Set a[^ ]* breakpoint here", num_expected_loc=287        )88        bkpt = self.target.FindBreakpointByID(bpno)89        bkpt.SetAutoContinue(False)90 91        loc = lldb.SBBreakpointLocation()92        for i in range(0, 2):93            func_name = bkpt.location[i].GetAddress().function.name94            if func_name == "main":95                loc = bkpt.location[i]96 97        self.assertTrue(loc.IsValid(), "Didn't find a location in main")98        loc.SetAutoContinue(True)99 100        process = self.launch_it(lldb.eStateStopped)101 102        threads = lldbutil.get_threads_stopped_at_breakpoint(process, bkpt)103        self.assertEqual(104            len(threads), 1, "Didn't get one thread stopped at our breakpoint"105        )106        func_name = threads[0].frame[0].function.name107        self.assertEqual(func_name, "call_me")108