""" Make sure that deleting breakpoints in another breakpoint callback doesn't cause problems. """ import lldb import lldbsuite.test.lldbutil as lldbutil from lldbsuite.test.lldbtest import * class TestBreakpointDeletionInCallback(TestBase): NO_DEBUG_INFO_TESTCASE = True def test_breakpoint_deletion_in_callback(self): self.build() self.main_source_file = lldb.SBFileSpec("main.c") self.delete_others_test() def delete_others_test(self): """You might use the test implementation in several ways, say so here.""" # This function starts a process, "a.out" by default, sets a source # breakpoint, runs to it, and returns the thread, process & target. # It optionally takes an SBLaunchOption argument if you want to pass # arguments or environment variables. (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint( self, "Set a breakpoint here", self.main_source_file ) # Now set a breakpoint on "I did something" several times # bkpt_numbers = [] for idx in range(0, 5): bkpt_numbers.append( lldbutil.run_break_set_by_source_regexp(self, "// Deletable location") ) # And add commands to the third one to delete two others: deleter = target.FindBreakpointByID(bkpt_numbers[2]) self.assertTrue(deleter.IsValid(), "Deleter is a good breakpoint") commands = lldb.SBStringList() deleted_ids = [bkpt_numbers[0], bkpt_numbers[3]] for idx in deleted_ids: commands.AppendString(f"break delete {idx}") deleter.SetCommandLineCommands(commands) thread_list = lldbutil.continue_to_breakpoint(process, deleter) self.assertEqual(len(thread_list), 1) stop_data = thread.stop_reason_data # There are 5 breakpoints so 10 break_id, break_loc_id. self.assertEqual(len(stop_data), 10) # We should have been able to get break ID's and locations for all the # breakpoints that we originally hit, but some won't be around anymore: for idx in range(0, 5): bkpt_id = stop_data[idx * 2] print(f"{idx}: {bkpt_id}") self.assertIn(bkpt_id, bkpt_numbers, "Found breakpoints are right") loc_id = stop_data[idx * 2 + 1] self.assertEqual(loc_id, 1, "All breakpoints have one location") bkpt = target.FindBreakpointByID(bkpt_id) if bkpt_id in deleted_ids: # Looking these up should be an error: self.assertFalse(bkpt.IsValid(), "Deleted breakpoints are deleted") else: self.assertTrue(bkpt.IsValid(), "The rest are still valid")