| """Test stepping over watchpoints.""" |
| |
| import unittest2 |
| import lldb |
| import lldbutil |
| from lldbtest import * |
| |
| |
| class TestStepOverWatchpoint(TestBase): |
| |
| mydir = TestBase.compute_mydir(__file__) |
| |
| def getCategories(self): |
| return ['basic_process'] |
| |
| @skipUnlessDarwin |
| @dsym_test |
| def test_with_dsym(self): |
| """Test stepping over watchpoints.""" |
| self.buildDsym() |
| self.step_over_watchpoint() |
| |
| @dwarf_test |
| def test_with_dwarf(self): |
| """Test stepping over watchpoints.""" |
| self.buildDwarf() |
| self.step_over_watchpoint() |
| |
| def setUp(self): |
| TestBase.setUp(self) |
| |
| def step_inst_for_watchpoint(self, wp_id): |
| watchpoint_hit = False |
| current_line = self.frame().GetLineEntry().GetLine() |
| while self.frame().GetLineEntry().GetLine() == current_line: |
| self.thread().StepInstruction(False) # step_over=False |
| stop_reason = self.thread().GetStopReason() |
| if stop_reason == lldb.eStopReasonWatchpoint: |
| self.assertFalse(watchpoint_hit, "Watchpoint already hit.") |
| expected_stop_desc = "watchpoint %d" % wp_id |
| actual_stop_desc = self.thread().GetStopDescription(20) |
| self.assertTrue(actual_stop_desc == expected_stop_desc, |
| "Watchpoint ID didn't match.") |
| watchpoint_hit = True |
| else: |
| self.assertTrue(stop_reason == lldb.eStopReasonPlanComplete, |
| STOPPED_DUE_TO_STEP_IN) |
| self.assertTrue(watchpoint_hit, "Watchpoint never hit.") |
| |
| def step_over_watchpoint(self): |
| """Test stepping over watchpoints.""" |
| exe = os.path.join(os.getcwd(), 'a.out') |
| |
| target = self.dbg.CreateTarget(exe) |
| self.assertTrue(self.target, VALID_TARGET) |
| |
| lldbutil.run_break_set_by_symbol(self, 'main') |
| |
| process = target.LaunchSimple(None, None, |
| self.get_process_working_directory()) |
| self.assertTrue(process.IsValid(), PROCESS_IS_VALID) |
| self.assertTrue(process.GetState() == lldb.eStateStopped, |
| PROCESS_STOPPED) |
| |
| thread = lldbutil.get_stopped_thread(process, |
| lldb.eStopReasonBreakpoint) |
| self.assertTrue(thread.IsValid(), "Failed to get thread.") |
| |
| frame = thread.GetFrameAtIndex(0) |
| self.assertTrue(frame.IsValid(), "Failed to get frame.") |
| |
| read_value = frame.FindValue('g_watch_me_read', |
| lldb.eValueTypeVariableGlobal) |
| self.assertTrue(read_value.IsValid(), "Failed to find read value.") |
| |
| error = lldb.SBError() |
| |
| # resolve_location=True, read=True, write=False |
| read_watchpoint = read_value.Watch(True, True, False, error) |
| self.assertTrue(error.Success(), |
| "Error while setting watchpoint: %s" % |
| error.GetCString()) |
| self.assertTrue(read_watchpoint, "Failed to set read watchpoint.") |
| |
| write_value = frame.FindValue('g_watch_me_write', |
| lldb.eValueTypeVariableGlobal) |
| self.assertTrue(write_value, "Failed to find write value.") |
| |
| # resolve_location=True, read=False, write=True |
| write_watchpoint = write_value.Watch(True, False, True, error) |
| self.assertTrue(read_watchpoint, "Failed to set write watchpoint.") |
| self.assertTrue(error.Success(), |
| "Error while setting watchpoint: %s" % |
| error.GetCString()) |
| |
| thread.StepOver() |
| self.assertTrue(thread.GetStopReason() == lldb.eStopReasonWatchpoint, |
| STOPPED_DUE_TO_WATCHPOINT) |
| self.assertTrue(thread.GetStopDescription(20) == 'watchpoint 1') |
| |
| process.Continue() |
| self.assertTrue(process.GetState() == lldb.eStateStopped, |
| PROCESS_STOPPED) |
| self.assertTrue(thread.GetStopDescription(20) == 'step over') |
| |
| self.step_inst_for_watchpoint(1) |
| |
| thread.StepOver() |
| self.assertTrue(thread.GetStopReason() == lldb.eStopReasonWatchpoint, |
| STOPPED_DUE_TO_WATCHPOINT) |
| self.assertTrue(thread.GetStopDescription(20) == 'watchpoint 2') |
| |
| process.Continue() |
| self.assertTrue(process.GetState() == lldb.eStateStopped, |
| PROCESS_STOPPED) |
| self.assertTrue(thread.GetStopDescription(20) == 'step over') |
| |
| self.step_inst_for_watchpoint(2) |
| |
| if __name__ == '__main__': |
| import atexit |
| lldb.SBDebugger.Initialize() |
| atexit.register(lambda: lldb.SBDebugger.Terminate()) |
| unittest2.main() |