Files
clang-p2996/lldb/test/API/functionalities/watchpoint/consecutive-watchpoints/TestConsecutiveWatchpoints.py
Jason Molenda cea82573bb [lldb] Skip TestConsecutiveWatchpoints.py if out of tree debugserver
The GreenDragon CI bots are currently passing because the installed
Xcode is a bit old, and doesn't have the watchpoint handling
bug that was fixed April with this test being added.

But on other CI running newer Xcode debugservers, this test will
fail.  Skip this test if we're using an out of tree debugserver.
2025-05-21 17:38:35 -07:00

98 lines
3.6 KiB
Python

"""
Watch contiguous memory regions with separate watchpoints, check that lldb
correctly detect which watchpoint was hit for each one.
"""
import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil
class ConsecutiveWatchpointsTestCase(TestBase):
NO_DEBUG_INFO_TESTCASE = True
def continue_and_report_stop_reason(self, process, iter_str):
process.Continue()
self.assertIn(
process.GetState(), [lldb.eStateStopped, lldb.eStateExited], iter_str
)
thread = process.GetSelectedThread()
return thread.GetStopReason()
# debugserver only gained the ability to watch larger regions
# with this patch.
@skipIfOutOfTreeDebugserver
def test_consecutive_watchpoints(self):
"""Test watchpoint that covers a large region of memory."""
self.build()
self.main_source_file = lldb.SBFileSpec("main.c")
(target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(
self, "break here", self.main_source_file
)
frame = thread.GetFrameAtIndex(0)
field2_wp = (
frame.locals["var"][0]
.GetChildMemberWithName("field2")
.Watch(True, False, True)
)
field3_wp = (
frame.locals["var"][0]
.GetChildMemberWithName("field3")
.Watch(True, False, True)
)
field4_wp = (
frame.locals["var"][0]
.GetChildMemberWithName("field4")
.Watch(True, False, True)
)
field5_wp = (
frame.locals["var"][0]
.GetChildMemberWithName("field5")
.Watch(True, False, True)
)
# Require that the first two watchpoints
# are set -- hopefully every machine running
# the testsuite can support two watchpoints.
self.assertTrue(field2_wp.IsValid())
self.assertTrue(field3_wp.IsValid())
reason = self.continue_and_report_stop_reason(process, "continue to field2 wp")
self.assertEqual(reason, lldb.eStopReasonWatchpoint)
stop_reason_watchpoint_id = (
process.GetSelectedThread().GetStopReasonDataAtIndex(0)
)
self.assertEqual(stop_reason_watchpoint_id, field2_wp.GetID())
reason = self.continue_and_report_stop_reason(process, "continue to field3 wp")
self.assertEqual(reason, lldb.eStopReasonWatchpoint)
stop_reason_watchpoint_id = (
process.GetSelectedThread().GetStopReasonDataAtIndex(0)
)
self.assertEqual(stop_reason_watchpoint_id, field3_wp.GetID())
# If we were able to set the second two watchpoints,
# check that they are hit. Some CI bots can only
# create two watchpoints.
if field4_wp.IsValid() and field5_wp.IsValid():
reason = self.continue_and_report_stop_reason(
process, "continue to field4 wp"
)
self.assertEqual(reason, lldb.eStopReasonWatchpoint)
stop_reason_watchpoint_id = (
process.GetSelectedThread().GetStopReasonDataAtIndex(0)
)
self.assertEqual(stop_reason_watchpoint_id, field4_wp.GetID())
reason = self.continue_and_report_stop_reason(
process, "continue to field5 wp"
)
self.assertEqual(reason, lldb.eStopReasonWatchpoint)
stop_reason_watchpoint_id = (
process.GetSelectedThread().GetStopReasonDataAtIndex(0)
)
self.assertEqual(stop_reason_watchpoint_id, field5_wp.GetID())