1e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen"""
2ecd4feb5111432d2878e95461220c720cb2d24c8Johnny ChenUse lldb Python SBWatchpoint API to set the ignore count.
3e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen"""
4e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen
5e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chenimport os, time
6e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chenimport re
7e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chenimport unittest2
8e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chenimport lldb, lldbutil
9e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chenfrom lldbtest import *
10e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen
11e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chenclass WatchpointIgnoreCountTestCase(TestBase):
12e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen
13e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen    mydir = os.path.join("python_api", "watchpoint")
14e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen
15e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen    def setUp(self):
16e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen        # Call super's setUp().
17e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen        TestBase.setUp(self)
18e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen        # Our simple source filename.
19e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen        self.source = 'main.c'
20e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen        # Find the line number to break inside main().
21e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen        self.line = line_number(self.source, '// Set break point at this line.')
22e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen
23e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen    @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
24e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen    @python_api_test
2521b1984e161b0cadee331d32bfd721eccfdf4b1fJohnny Chen    @dsym_test
26ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen    def test_set_watch_ignore_count_with_dsym(self):
27ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen        """Test SBWatchpoint.SetIgnoreCount() API."""
28e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen        self.buildDsym()
29ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen        self.do_watchpoint_ignore_count()
30e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen
313bf526ac0f51dda6f63be3421cd7de68720dd656Ed Maste    @expectedFailureFreeBSD('llvm.org/pr16706') # Watchpoints fail on FreeBSD
32e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen    @python_api_test
3321b1984e161b0cadee331d32bfd721eccfdf4b1fJohnny Chen    @dwarf_test
34ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen    def test_set_watch_ignore_count_with_dwarf(self):
35ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen        """Test SBWatchpoint.SetIgnoreCount() API."""
36e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen        self.buildDwarf()
37ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen        self.do_watchpoint_ignore_count()
38e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen
39ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen    def do_watchpoint_ignore_count(self):
40ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen        """Test SBWatchpoint.SetIgnoreCount() API."""
41e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen        exe = os.path.join(os.getcwd(), "a.out")
42e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen
43e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen        # Create a target by the debugger.
44e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen        target = self.dbg.CreateTarget(exe)
45e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen        self.assertTrue(target, VALID_TARGET)
46e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen
47e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen        # Create a breakpoint on main.c in order to set our watchpoint later.
48e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen        breakpoint = target.BreakpointCreateByLocation(self.source, self.line)
49e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen        self.assertTrue(breakpoint and
50e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen                        breakpoint.GetNumLocations() == 1,
51e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen                        VALID_BREAKPOINT)
52e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen
53e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen        # Now launch the process, and do not stop at the entry point.
54e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen        process = target.LaunchSimple(None, None, os.getcwd())
55e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen
56e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen        # We should be stopped due to the breakpoint.  Get frame #0.
57e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen        process = target.GetProcess()
58e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen        self.assertTrue(process.GetState() == lldb.eStateStopped,
59e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen                        PROCESS_STOPPED)
60e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen        thread = lldbutil.get_stopped_thread(process, lldb.eStopReasonBreakpoint)
61e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen        frame0 = thread.GetFrameAtIndex(0)
62e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen
63e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen        # Watch 'global' for read and write.
64ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen        value = frame0.FindValue('global', lldb.eValueTypeVariableGlobal)
653f883496e92fce5011f6bf585af3ac6d1cddb64fJohnny Chen        error = lldb.SBError();
663f883496e92fce5011f6bf585af3ac6d1cddb64fJohnny Chen        watchpoint = value.Watch(True, True, True, error)
67ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen        self.assertTrue(value and watchpoint,
68ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen                        "Successfully found the variable and set a watchpoint")
69e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen        self.DebugSBValue(value)
70e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen
71e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen        # Hide stdout if not running with '-t' option.
72e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen        if not self.TraceOn():
73e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen            self.HideStdout()
74e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen
75e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen        # There should be only 1 watchpoint location under the target.
76ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen        self.assertTrue(target.GetNumWatchpoints() == 1)
77ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen        watchpoint = target.GetWatchpointAtIndex(0)
78ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen        self.assertTrue(watchpoint.IsEnabled())
79ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen        self.assertTrue(watchpoint.GetIgnoreCount() == 0)
80ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen        watch_id = watchpoint.GetID()
81e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen        self.assertTrue(watch_id != 0)
82ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen        print watchpoint
83e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen
84e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen        # Now immediately set the ignore count to 2.  When we continue, expect the
85e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen        # inferior to run to its completion without stopping due to watchpoint.
86ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen        watchpoint.SetIgnoreCount(2)
87ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen        print watchpoint
88e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen        process.Continue()
89e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen
90e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen        # At this point, the inferior process should have exited.
91e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen        self.assertTrue(process.GetState() == lldb.eStateExited, PROCESS_EXITED)
92e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen
93e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen        # Verify some vital statistics.
94ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen        self.assertTrue(watchpoint)
95ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen        self.assertTrue(watchpoint.GetWatchSize() == 4)
96ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen        self.assertTrue(watchpoint.GetHitCount() == 2)
97ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen        print watchpoint
98e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen
99e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen
100e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chenif __name__ == '__main__':
101e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen    import atexit
102e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen    lldb.SBDebugger.Initialize()
103e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen    atexit.register(lambda: lldb.SBDebugger.Terminate())
104e14cf4e7dc9d561224f744807b70a8ab91a8b36dJohnny Chen    unittest2.main()
105