brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.1 KiB · fe1d4b5 Raw
106 lines · python
1"""2Test that lldb watchpoint works for multiple threads.3"""4 5import re6import lldb7from lldbsuite.test.decorators import *8from lldbsuite.test.lldbtest import *9from lldbsuite.test import lldbutil10 11 12class WatchpointForMultipleThreadsTestCase(TestBase):13    NO_DEBUG_INFO_TESTCASE = True14    main_spec = lldb.SBFileSpec("main.cpp", False)15 16    @skipIfWindows  # This test is flaky on Windows17    def test_watchpoint_before_thread_start(self):18        """Test that we can hit a watchpoint we set before starting another thread"""19        self.do_watchpoint_test("Before running the thread")20 21    @skipIfWindows  # This test is flaky on Windows22    def test_watchpoint_after_thread_launch(self):23        """Test that we can hit a watchpoint we set after launching another thread"""24        self.do_watchpoint_test("After launching the thread")25 26    def test_watchpoint_after_thread_start(self):27        """Test that we can hit a watchpoint we set after another thread starts"""28        self.do_watchpoint_test("After running the thread")29 30    def do_watchpoint_test(self, line):31        self.build()32        lldbutil.run_to_source_breakpoint(self, line, self.main_spec)33 34        # Now let's set a write-type watchpoint for variable 'g_val'.35        self.expect(36            "watchpoint set variable -w write g_val",37            WATCHPOINT_CREATED,38            substrs=["Watchpoint created", "size = 4", "type = w"],39        )40 41        # Use the '-v' option to do verbose listing of the watchpoint.42        # The hit count should be 0 initially.43        self.expect("watchpoint list -v", substrs=["hit_count = 0"])44 45        self.runCmd("process continue")46 47        self.runCmd("thread list")48        if "stop reason = watchpoint" in self.res.GetOutput():49            # Good, we verified that the watchpoint works!50            self.runCmd("thread backtrace all")51        else:52            self.fail("The stop reason should be either break or watchpoint")53 54        # Use the '-v' option to do verbose listing of the watchpoint.55        # The hit count should now be 1.56        self.expect("watchpoint list -v", substrs=["hit_count = 1"])57 58    def test_watchpoint_multiple_threads_wp_set_and_then_delete(self):59        """Test that lldb watchpoint works for multiple threads, and after the watchpoint is deleted, the watchpoint event should no longer fires."""60        self.build()61        self.setTearDownCleanup()62 63        lldbutil.run_to_source_breakpoint(64            self, "After running the thread", self.main_spec65        )66 67        # Now let's set a write-type watchpoint for variable 'g_val'.68        self.expect(69            "watchpoint set variable -w write g_val",70            WATCHPOINT_CREATED,71            substrs=["Watchpoint created", "size = 4", "type = w"],72        )73 74        # Use the '-v' option to do verbose listing of the watchpoint.75        # The hit count should be 0 initially.76        self.expect("watchpoint list -v", substrs=["hit_count = 0"])77 78        watchpoint_stops = 079        while True:80            self.runCmd("process continue")81            self.runCmd("process status")82            if re.search("Process .* exited", self.res.GetOutput()):83                # Great, we are done with this test!84                break85 86            self.runCmd("thread list")87            if "stop reason = watchpoint" in self.res.GetOutput():88                self.runCmd("thread backtrace all")89                watchpoint_stops += 190                if watchpoint_stops > 1:91                    self.fail("Watchpoint hits not supposed to exceed 1 by design!")92                # Good, we verified that the watchpoint works!  Now delete the93                # watchpoint.94                if self.TraceOn():95                    print(96                        "watchpoint_stops=%d at the moment we delete the watchpoint"97                        % watchpoint_stops98                    )99                self.runCmd("watchpoint delete 1")100                self.expect(101                    "watchpoint list -v", substrs=["No watchpoints currently set."]102                )103                continue104            else:105                self.fail("The stop reason should be either break or watchpoint")106