199451b44SJordan Rupprecht""" 299451b44SJordan RupprechtTest that breakpoints do not affect stepping. 399451b44SJordan RupprechtCheck for correct StopReason when stepping to the line with breakpoint 4e9264b74SKazuaki Ishizakiwhich should be eStopReasonBreakpoint in general, 599451b44SJordan Rupprechtand eStopReasonPlanComplete when breakpoint's condition fails. 699451b44SJordan Rupprecht""" 799451b44SJordan Rupprecht 899451b44SJordan Rupprecht 999451b44SJordan Rupprechtimport unittest2 1099451b44SJordan Rupprechtimport lldb 1199451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 1299451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 1399451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 1499451b44SJordan Rupprecht 1599451b44SJordan Rupprechtclass StepOverBreakpointsTestCase(TestBase): 1699451b44SJordan Rupprecht 1799451b44SJordan Rupprecht def setUp(self): 1899451b44SJordan Rupprecht TestBase.setUp(self) 1999451b44SJordan Rupprecht 2099451b44SJordan Rupprecht self.build() 2199451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 2299451b44SJordan Rupprecht src = lldb.SBFileSpec("main.cpp") 2399451b44SJordan Rupprecht 2499451b44SJordan Rupprecht # Create a target by the debugger. 2599451b44SJordan Rupprecht self.target = self.dbg.CreateTarget(exe) 2699451b44SJordan Rupprecht self.assertTrue(self.target, VALID_TARGET) 2799451b44SJordan Rupprecht 2899451b44SJordan Rupprecht # Setup four breakpoints, two of them with false condition 2999451b44SJordan Rupprecht self.line1 = line_number('main.cpp', "breakpoint_1") 3099451b44SJordan Rupprecht self.line4 = line_number('main.cpp', "breakpoint_4") 3199451b44SJordan Rupprecht 3299451b44SJordan Rupprecht self.breakpoint1 = self.target.BreakpointCreateByLocation(src, self.line1) 3399451b44SJordan Rupprecht self.assertTrue( 3499451b44SJordan Rupprecht self.breakpoint1 and self.breakpoint1.GetNumLocations() == 1, 3599451b44SJordan Rupprecht VALID_BREAKPOINT) 3699451b44SJordan Rupprecht 3799451b44SJordan Rupprecht self.breakpoint2 = self.target.BreakpointCreateBySourceRegex("breakpoint_2", src) 3899451b44SJordan Rupprecht self.breakpoint2.GetLocationAtIndex(0).SetCondition('false') 3999451b44SJordan Rupprecht 4099451b44SJordan Rupprecht self.breakpoint3 = self.target.BreakpointCreateBySourceRegex("breakpoint_3", src) 4199451b44SJordan Rupprecht self.breakpoint3.GetLocationAtIndex(0).SetCondition('false') 4299451b44SJordan Rupprecht 4399451b44SJordan Rupprecht self.breakpoint4 = self.target.BreakpointCreateByLocation(src, self.line4) 4499451b44SJordan Rupprecht 4599451b44SJordan Rupprecht # Start debugging 4699451b44SJordan Rupprecht self.process = self.target.LaunchSimple( 4799451b44SJordan Rupprecht None, None, self.get_process_working_directory()) 4899451b44SJordan Rupprecht self.assertIsNotNone(self.process, PROCESS_IS_VALID) 4999451b44SJordan Rupprecht self.thread = lldbutil.get_one_thread_stopped_at_breakpoint(self.process, self.breakpoint1) 5099451b44SJordan Rupprecht self.assertIsNotNone(self.thread, "Didn't stop at breakpoint 1.") 5199451b44SJordan Rupprecht 5299451b44SJordan Rupprecht def test_step_instruction(self): 5399451b44SJordan Rupprecht # Count instructions between breakpoint_1 and breakpoint_4 5499451b44SJordan Rupprecht contextList = self.target.FindFunctions('main', lldb.eFunctionNameTypeAuto) 5599451b44SJordan Rupprecht self.assertEquals(contextList.GetSize(), 1) 5699451b44SJordan Rupprecht symbolContext = contextList.GetContextAtIndex(0) 5799451b44SJordan Rupprecht function = symbolContext.GetFunction() 5899451b44SJordan Rupprecht self.assertTrue(function) 5999451b44SJordan Rupprecht instructions = function.GetInstructions(self.target) 6099451b44SJordan Rupprecht addr_1 = self.breakpoint1.GetLocationAtIndex(0).GetAddress() 6199451b44SJordan Rupprecht addr_4 = self.breakpoint4.GetLocationAtIndex(0).GetAddress() 6299451b44SJordan Rupprecht 6399451b44SJordan Rupprecht # if third argument is true then the count will be the number of 6499451b44SJordan Rupprecht # instructions on which a breakpoint can be set. 6599451b44SJordan Rupprecht # start = addr_1, end = addr_4, canSetBreakpoint = True 6699451b44SJordan Rupprecht steps_expected = instructions.GetInstructionsCount(addr_1, addr_4, True) 6799451b44SJordan Rupprecht step_count = 0 6899451b44SJordan Rupprecht # Step from breakpoint_1 to breakpoint_4 6999451b44SJordan Rupprecht while True: 7099451b44SJordan Rupprecht self.thread.StepInstruction(True) 7199451b44SJordan Rupprecht step_count = step_count + 1 72*ce825e46SJonas Devlieghere self.assertState(self.process.GetState(), lldb.eStateStopped) 7399451b44SJordan Rupprecht self.assertTrue(self.thread.GetStopReason() == lldb.eStopReasonPlanComplete or 7499451b44SJordan Rupprecht self.thread.GetStopReason() == lldb.eStopReasonBreakpoint) 7599451b44SJordan Rupprecht if (self.thread.GetStopReason() == lldb.eStopReasonBreakpoint) : 7699451b44SJordan Rupprecht # we should not stop on breakpoint_2 and _3 because they have false condition 7799451b44SJordan Rupprecht self.assertEquals(self.thread.GetFrameAtIndex(0).GetLineEntry().GetLine(), self.line4) 7899451b44SJordan Rupprecht # breakpoint_2 and _3 should not affect step count 7999451b44SJordan Rupprecht self.assertTrue(step_count >= steps_expected) 8099451b44SJordan Rupprecht break 8199451b44SJordan Rupprecht 8299451b44SJordan Rupprecht # Run the process until termination 8399451b44SJordan Rupprecht self.process.Continue() 84*ce825e46SJonas Devlieghere self.assertState(self.process.GetState(), lldb.eStateExited) 8599451b44SJordan Rupprecht 8699451b44SJordan Rupprecht @skipIf(bugnumber="llvm.org/pr31972", hostoslist=["windows"]) 8799451b44SJordan Rupprecht def test_step_over(self): 8899451b44SJordan Rupprecht 8999451b44SJordan Rupprecht self.thread.StepOver() 9099451b44SJordan Rupprecht # We should be stopped at the breakpoint_2 line with stop plan complete reason 91*ce825e46SJonas Devlieghere self.assertState(self.process.GetState(), lldb.eStateStopped) 9299451b44SJordan Rupprecht self.assertEquals(self.thread.GetStopReason(), lldb.eStopReasonPlanComplete) 9399451b44SJordan Rupprecht 9499451b44SJordan Rupprecht self.thread.StepOver() 9599451b44SJordan Rupprecht # We should be stopped at the breakpoint_3 line with stop plan complete reason 96*ce825e46SJonas Devlieghere self.assertState(self.process.GetState(), lldb.eStateStopped) 9799451b44SJordan Rupprecht self.assertEquals(self.thread.GetStopReason(), lldb.eStopReasonPlanComplete) 9899451b44SJordan Rupprecht 9999451b44SJordan Rupprecht self.thread.StepOver() 10099451b44SJordan Rupprecht # We should be stopped at the breakpoint_4 101*ce825e46SJonas Devlieghere self.assertState(self.process.GetState(), lldb.eStateStopped) 10299451b44SJordan Rupprecht self.assertEquals(self.thread.GetStopReason(), lldb.eStopReasonBreakpoint) 10399451b44SJordan Rupprecht thread1 = lldbutil.get_one_thread_stopped_at_breakpoint(self.process, self.breakpoint4) 10499451b44SJordan Rupprecht self.assertEquals(self.thread, thread1, "Didn't stop at breakpoint 4.") 10599451b44SJordan Rupprecht 10699451b44SJordan Rupprecht # Check that stepping does not affect breakpoint's hit count 10799451b44SJordan Rupprecht self.assertEquals(self.breakpoint1.GetHitCount(), 1) 10899451b44SJordan Rupprecht self.assertEquals(self.breakpoint2.GetHitCount(), 0) 10999451b44SJordan Rupprecht self.assertEquals(self.breakpoint3.GetHitCount(), 0) 11099451b44SJordan Rupprecht self.assertEquals(self.breakpoint4.GetHitCount(), 1) 11199451b44SJordan Rupprecht 11299451b44SJordan Rupprecht # Run the process until termination 11399451b44SJordan Rupprecht self.process.Continue() 114*ce825e46SJonas Devlieghere self.assertState(self.process.GetState(), lldb.eStateExited) 11599451b44SJordan Rupprecht 116