199451b44SJordan Rupprecht"""
299451b44SJordan RupprechtTest address breakpoints set with shared library of SBAddress work correctly.
399451b44SJordan Rupprecht"""
499451b44SJordan Rupprecht
599451b44SJordan Rupprecht
699451b44SJordan Rupprecht
799451b44SJordan Rupprechtimport lldb
899451b44SJordan Rupprechtimport lldbsuite.test.lldbutil as lldbutil
999451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
1099451b44SJordan Rupprecht
1199451b44SJordan Rupprecht
1299451b44SJordan Rupprechtclass AddressBreakpointTestCase(TestBase):
1399451b44SJordan Rupprecht
1499451b44SJordan Rupprecht    NO_DEBUG_INFO_TESTCASE = True
1599451b44SJordan Rupprecht
1699451b44SJordan Rupprecht    def test_address_breakpoints(self):
1799451b44SJordan Rupprecht        """Test address breakpoints set with shared library of SBAddress work correctly."""
1899451b44SJordan Rupprecht        self.build()
1999451b44SJordan Rupprecht        self.address_breakpoints()
2099451b44SJordan Rupprecht
2199451b44SJordan Rupprecht    def address_breakpoints(self):
2299451b44SJordan Rupprecht        """Test address breakpoints set with shared library of SBAddress work correctly."""
23*54c26872SRaphael Isemann        target = self.createTestTarget()
2499451b44SJordan Rupprecht
2599451b44SJordan Rupprecht        # Now create a breakpoint on main.c by name 'c'.
2699451b44SJordan Rupprecht        breakpoint = target.BreakpointCreateBySourceRegex(
2799451b44SJordan Rupprecht            "Set a breakpoint here", lldb.SBFileSpec("main.c"))
2899451b44SJordan Rupprecht        self.assertTrue(breakpoint and
2999451b44SJordan Rupprecht                        breakpoint.GetNumLocations() >= 1,
3099451b44SJordan Rupprecht                        VALID_BREAKPOINT)
3199451b44SJordan Rupprecht
3299451b44SJordan Rupprecht        # Get the breakpoint location from breakpoint after we verified that,
3399451b44SJordan Rupprecht        # indeed, it has one location.
3499451b44SJordan Rupprecht        location = breakpoint.GetLocationAtIndex(0)
3599451b44SJordan Rupprecht        self.assertTrue(location and
3699451b44SJordan Rupprecht                        location.IsEnabled(),
3799451b44SJordan Rupprecht                        VALID_BREAKPOINT_LOCATION)
3899451b44SJordan Rupprecht
3999451b44SJordan Rupprecht        # Next get the address from the location, and create an address breakpoint using
4099451b44SJordan Rupprecht        # that address:
4199451b44SJordan Rupprecht
4299451b44SJordan Rupprecht        address = location.GetAddress()
4399451b44SJordan Rupprecht        target.BreakpointDelete(breakpoint.GetID())
4499451b44SJordan Rupprecht
4599451b44SJordan Rupprecht        breakpoint = target.BreakpointCreateBySBAddress(address)
4699451b44SJordan Rupprecht
4799451b44SJordan Rupprecht        # Disable ASLR.  This will allow us to actually test (on platforms that support this flag)
4899451b44SJordan Rupprecht        # that the breakpoint was able to track the module.
4999451b44SJordan Rupprecht
5099451b44SJordan Rupprecht        launch_info = lldb.SBLaunchInfo(None)
5199451b44SJordan Rupprecht        flags = launch_info.GetLaunchFlags()
5299451b44SJordan Rupprecht        flags &= ~lldb.eLaunchFlagDisableASLR
5386aa8e63SJonas Devlieghere        flags &= lldb.eLaunchFlagInheritTCCFromParent
5499451b44SJordan Rupprecht        launch_info.SetLaunchFlags(flags)
5599451b44SJordan Rupprecht
5699451b44SJordan Rupprecht        error = lldb.SBError()
5799451b44SJordan Rupprecht
5899451b44SJordan Rupprecht        process = target.Launch(launch_info, error)
5999451b44SJordan Rupprecht        self.assertTrue(process, PROCESS_IS_VALID)
6099451b44SJordan Rupprecht
6199451b44SJordan Rupprecht        # Did we hit our breakpoint?
6299451b44SJordan Rupprecht        from lldbsuite.test.lldbutil import get_threads_stopped_at_breakpoint
6399451b44SJordan Rupprecht        threads = get_threads_stopped_at_breakpoint(process, breakpoint)
640ed758b2SDave Lee        self.assertEqual(
650ed758b2SDave Lee            len(threads), 1,
6699451b44SJordan Rupprecht            "There should be a thread stopped at our breakpoint")
6799451b44SJordan Rupprecht
6899451b44SJordan Rupprecht        # The hit count for the breakpoint should be 1.
69b3a0c4d7SRaphael Isemann        self.assertEquals(breakpoint.GetHitCount(), 1)
7099451b44SJordan Rupprecht
7199451b44SJordan Rupprecht        process.Kill()
7299451b44SJordan Rupprecht
7399451b44SJordan Rupprecht        # Now re-launch and see that we hit the breakpoint again:
7499451b44SJordan Rupprecht        launch_info.Clear()
7599451b44SJordan Rupprecht        launch_info.SetLaunchFlags(flags)
7699451b44SJordan Rupprecht
7799451b44SJordan Rupprecht        process = target.Launch(launch_info, error)
7899451b44SJordan Rupprecht        self.assertTrue(process, PROCESS_IS_VALID)
7999451b44SJordan Rupprecht
8099451b44SJordan Rupprecht        thread = get_threads_stopped_at_breakpoint(process, breakpoint)
810ed758b2SDave Lee        self.assertEqual(
820ed758b2SDave Lee            len(threads), 1,
8399451b44SJordan Rupprecht            "There should be a thread stopped at our breakpoint")
8499451b44SJordan Rupprecht
8599451b44SJordan Rupprecht        # The hit count for the breakpoint should now be 2.
86b3a0c4d7SRaphael Isemann        self.assertEquals(breakpoint.GetHitCount(), 2)
87