| """ |
| 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. |
| |
| """ |
| |
| from __future__ import print_function |
| |
| import os |
| import time |
| 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 |
| |
| mydir = TestBase.compute_mydir(__file__) |
| |
| 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} |
| |
| @expectedFailureAll( |
| oslist=["windows"], |
| bugnumber="llvm.org/pr24446: WINDOWS XFAIL TRIAGE - Watchpoints not supported on Windows") |
| # 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') |
| |
| @expectedFailureAll( |
| oslist=["windows"], |
| bugnumber="llvm.org/pr24446: WINDOWS XFAIL TRIAGE - Watchpoints not supported on Windows") |
| # 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') |
| |
| @expectedFailureAll( |
| oslist=["windows"], |
| bugnumber="llvm.org/pr24446: WINDOWS XFAIL TRIAGE - Watchpoints not supported on Windows") |
| # 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") |