brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.1 KiB · 2f4ed5a Raw
84 lines · python
1"""2Test that a variable watchpoint should only hit when in scope.3"""4 5 6import lldb7from lldbsuite.test.lldbtest import *8import lldbsuite.test.lldbutil as lldbutil9from lldbsuite.test.decorators import *10 11 12class WatchedVariableHitWhenInScopeTestCase(TestBase):13    NO_DEBUG_INFO_TESTCASE = True14 15    # This test depends on not tracking watchpoint expression hits if we have16    # left the watchpoint scope.  We will provide such an ability at some point17    # but the way this was done was incorrect, and it is unclear that for the18    # most part that's not what folks mostly want, so we have to provide a19    # clearer API to express this.20 21    def setUp(self):22        # Call super's setUp().23        TestBase.setUp(self)24        # Our simple source filename.25        self.source = "main.c"26        self.exe_name = self.testMethodName27        self.d = {"C_SOURCES": self.source, "EXE": self.exe_name}28 29    # Test hangs due to a kernel bug, see fdfeff0f in the linux kernel for details30    @skipIfTargetAndroid(api_levels=list(range(25 + 1)), archs=["aarch64", "arm$"])31    @skip32    def test_watched_var_should_only_hit_when_in_scope(self):33        """Test that a variable watchpoint should only hit when in scope."""34        self.build(dictionary=self.d)35        self.setTearDownCleanup(dictionary=self.d)36 37        exe = self.getBuildArtifact(self.exe_name)38        self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)39 40        # Add a breakpoint to set a watchpoint when stopped in main.41        lldbutil.run_break_set_by_symbol(self, "main", num_expected_locations=-1)42 43        # Run the program.44        self.runCmd("run", RUN_SUCCEEDED)45 46        # We should be stopped again due to the breakpoint.47        # The stop reason of the thread should be breakpoint.48        self.expect(49            "thread list",50            STOPPED_DUE_TO_BREAKPOINT,51            substrs=["stopped", "stop reason = breakpoint"],52        )53 54        # Now let's set a watchpoint for 'c.a'.55        # There should be only one watchpoint hit (see main.c).56        self.expect(57            "watchpoint set variable c.a",58            WATCHPOINT_CREATED,59            substrs=["Watchpoint created", "size = 4", "type = w"],60        )61 62        # Use the '-v' option to do verbose listing of the watchpoint.63        # The hit count should be 0 initially.64        self.expect("watchpoint list -v", substrs=["hit_count = 0"])65 66        self.runCmd("process continue")67 68        # We should be stopped again due to the watchpoint (write type), but69        # only once.  The stop reason of the thread should be watchpoint.70        self.expect(71            "thread list",72            STOPPED_DUE_TO_WATCHPOINT,73            substrs=["stopped", "stop reason = watchpoint"],74        )75 76        self.runCmd("process continue")77        # Don't expect the read of 'global' to trigger a stop exception.78        # The process status should be 'exited'.79        self.expect("process status", substrs=["exited"])80 81        # Use the '-v' option to do verbose listing of the watchpoint.82        # The hit count should now be 1.83        self.expect("watchpoint list -v", substrs=["hit_count = 1"])84