| """ | |
| Test address breakpoints set with shared library of SBAddress work correctly. | |
| """ | |
| import lldb | |
| import lldbsuite.test.lldbutil as lldbutil | |
| from lldbsuite.test.lldbtest import * | |
| class AddressBreakpointTestCase(TestBase): | |
| NO_DEBUG_INFO_TESTCASE = True | |
| def test_address_breakpoints(self): | |
| """Test address breakpoints set with shared library of SBAddress work correctly.""" | |
| self.build() | |
| self.address_breakpoints() | |
| def address_breakpoints(self): | |
| """Test address breakpoints set with shared library of SBAddress work correctly.""" | |
| target = self.createTestTarget() | |
| # Now create a breakpoint on main.c by name 'c'. | |
| breakpoint = target.BreakpointCreateBySourceRegex( | |
| "Set a breakpoint here", lldb.SBFileSpec("main.c") | |
| ) | |
| self.assertTrue( | |
| breakpoint and breakpoint.GetNumLocations() >= 1, VALID_BREAKPOINT | |
| ) | |
| # Get the breakpoint location from breakpoint after we verified that, | |
| # indeed, it has one location. | |
| location = breakpoint.GetLocationAtIndex(0) | |
| self.assertTrue(location and location.IsEnabled(), VALID_BREAKPOINT_LOCATION) | |
| # Next get the address from the location, and create an address breakpoint using | |
| # that address: | |
| address = location.GetAddress() | |
| target.BreakpointDelete(breakpoint.GetID()) | |
| breakpoint = target.BreakpointCreateBySBAddress(address) | |
| # Disable ASLR. This will allow us to actually test (on platforms that support this flag) | |
| # that the breakpoint was able to track the module. | |
| launch_info = lldb.SBLaunchInfo(None) | |
| flags = launch_info.GetLaunchFlags() | |
| flags &= ~lldb.eLaunchFlagDisableASLR | |
| flags &= lldb.eLaunchFlagInheritTCCFromParent | |
| launch_info.SetLaunchFlags(flags) | |
| error = lldb.SBError() | |
| process = target.Launch(launch_info, error) | |
| self.assertTrue(process, PROCESS_IS_VALID) | |
| # Did we hit our breakpoint? | |
| from lldbsuite.test.lldbutil import get_threads_stopped_at_breakpoint | |
| threads = get_threads_stopped_at_breakpoint(process, breakpoint) | |
| self.assertEqual( | |
| len(threads), 1, "There should be a thread stopped at our breakpoint" | |
| ) | |
| # The hit count for the breakpoint should be 1. | |
| self.assertEqual(breakpoint.GetHitCount(), 1) | |
| process.Kill() | |
| # Now re-launch and see that we hit the breakpoint again: | |
| launch_info.Clear() | |
| launch_info.SetLaunchFlags(flags) | |
| process = target.Launch(launch_info, error) | |
| self.assertTrue(process, PROCESS_IS_VALID) | |
| thread = get_threads_stopped_at_breakpoint(process, breakpoint) | |
| self.assertEqual( | |
| len(threads), 1, "There should be a thread stopped at our breakpoint" | |
| ) | |
| # The hit count for the breakpoint should be 1, since we reset counts | |
| # for each run. | |
| self.assertEqual(breakpoint.GetHitCount(), 1) |