blob: 2b8fc662ad42e5d36b891336f969ba043cf74349 [file] [log] [blame]
"""
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")