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