""" Test watchpoint size cases (1-byte, 2-byte, 4-byte). Make sure we can watch all bytes, words or double words individually when they are packed in a 8-byte region. """ import lldb from lldbsuite.test.decorators import * from lldbsuite.test.lldbtest import * from lldbsuite.test import lldbutil class WatchpointSizeTestCase(TestBase): NO_DEBUG_INFO_TESTCASE = True def setUp(self): # Call super's setUp(). TestBase.setUp(self) # Source filename. self.source = "main.c" # Output filename. self.exe_name = self.getBuildArtifact("a.out") self.d = {"C_SOURCES": self.source, "EXE": self.exe_name} # Read-write watchpoints not supported on SystemZ @expectedFailureAll(archs=["s390x"]) def test_byte_size_watchpoints_with_byte_selection(self): """Test to selectively watch different bytes in a 8-byte array.""" self.run_watchpoint_size_test("byteArray", 8, "1") # Read-write watchpoints not supported on SystemZ @expectedFailureAll(archs=["s390x"]) def test_two_byte_watchpoints_with_word_selection(self): """Test to selectively watch different words in an 8-byte word array.""" self.run_watchpoint_size_test("wordArray", 4, "2") # Read-write watchpoints not supported on SystemZ @expectedFailureAll(archs=["s390x"]) def test_four_byte_watchpoints_with_dword_selection(self): """Test to selectively watch two double words in an 8-byte dword array.""" self.run_watchpoint_size_test("dwordArray", 2, "4") def run_watchpoint_size_test(self, arrayName, array_size, watchsize): self.build(dictionary=self.d) self.setTearDownCleanup(dictionary=self.d) exe = self.getBuildArtifact(self.exe_name) self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) # Detect line number after which we are going to increment arrayName. loc_line = line_number("main.c", "// About to write " + arrayName) # Set a breakpoint on the line detected above. lldbutil.run_break_set_by_file_and_line( self, "main.c", loc_line, num_expected_locations=1, loc_exact=True ) # Run the program. self.runCmd("run", RUN_SUCCEEDED) for i in range(array_size): # We should be stopped again due to the breakpoint. # The stop reason of the thread should be breakpoint. self.expect( "thread list", STOPPED_DUE_TO_BREAKPOINT, substrs=["stopped", "stop reason = breakpoint"], ) # Set a read_write type watchpoint arrayName watch_loc = arrayName + "[" + str(i) + "]" self.expect( "watchpoint set variable -w read_write " + watch_loc, WATCHPOINT_CREATED, substrs=["Watchpoint created", "size = " + watchsize, "type = rw"], ) # Use the '-v' option to do verbose listing of the watchpoint. # The hit count should be 0 initially. self.expect("watchpoint list -v", substrs=["hit_count = 0"]) self.runCmd("process continue") # We should be stopped due to the watchpoint. # The stop reason of the thread should be watchpoint. self.expect( "thread list", STOPPED_DUE_TO_WATCHPOINT, substrs=["stopped", "stop reason = watchpoint"], ) # Use the '-v' option to do verbose listing of the watchpoint. # The hit count should now be 1. self.expect("watchpoint list -v", substrs=["hit_count = 1"]) self.runCmd("process continue") # We should be stopped due to the watchpoint. # The stop reason of the thread should be watchpoint. self.expect( "thread list", STOPPED_DUE_TO_WATCHPOINT, substrs=["stopped", "stop reason = watchpoint"], ) # Use the '-v' option to do verbose listing of the watchpoint. # The hit count should now be 1. # Verify hit_count has been updated after value has been read. self.expect("watchpoint list -v", substrs=["hit_count = 2"]) # Delete the watchpoint immediately, but set auto-confirm to true # first. self.runCmd("settings set auto-confirm true") self.expect("watchpoint delete", substrs=["All watchpoints removed."]) # Restore the original setting of auto-confirm. self.runCmd("settings clear auto-confirm") self.runCmd("process continue")