""" Test that we handle breakpoints on consecutive instructions correctly. """ from __future__ import print_function import unittest2 import lldb from lldbsuite.test.decorators import * from lldbsuite.test.lldbtest import * from lldbsuite.test import lldbutil class ConsecutiveBreakpointsTestCase(TestBase): mydir = TestBase.compute_mydir(__file__) def prepare_test(self): self.build() (self.target, self.process, self.thread, bkpt) = lldbutil.run_to_source_breakpoint( self, "Set breakpoint here", lldb.SBFileSpec("main.cpp")) # Set breakpoint to the next instruction frame = self.thread.GetFrameAtIndex(0) address = frame.GetPCAddress() instructions = self.target.ReadInstructions(address, 2) self.assertTrue(len(instructions) == 2) self.bkpt_address = instructions[1].GetAddress() self.breakpoint2 = self.target.BreakpointCreateByAddress( self.bkpt_address.GetLoadAddress(self.target)) self.assertTrue( self.breakpoint2 and self.breakpoint2.GetNumLocations() == 1, VALID_BREAKPOINT) def finish_test(self): # Run the process until termination self.process.Continue() self.assertEquals(self.process.GetState(), lldb.eStateExited) @no_debug_info_test def test_continue(self): """Test that continue stops at the second breakpoint.""" self.prepare_test() self.process.Continue() self.assertEquals(self.process.GetState(), lldb.eStateStopped) # We should be stopped at the second breakpoint self.thread = lldbutil.get_one_thread_stopped_at_breakpoint( self.process, self.breakpoint2) self.assertIsNotNone( self.thread, "Expected one thread to be stopped at breakpoint 2") self.finish_test() @no_debug_info_test def test_single_step(self): """Test that single step stops at the second breakpoint.""" self.prepare_test() step_over = False self.thread.StepInstruction(step_over) self.assertEquals(self.process.GetState(), lldb.eStateStopped) self.assertEquals( self.thread.GetFrameAtIndex(0).GetPCAddress().GetLoadAddress( self.target), self.bkpt_address.GetLoadAddress( self.target)) self.thread = lldbutil.get_one_thread_stopped_at_breakpoint( self.process, self.breakpoint2) self.assertIsNotNone( self.thread, "Expected one thread to be stopped at breakpoint 2") self.finish_test() @no_debug_info_test def test_single_step_thread_specific(self): """Test that single step stops, even though the second breakpoint is not valid.""" self.prepare_test() # Choose a thread other than the current one. A non-existing thread is # fine. thread_index = self.process.GetNumThreads() + 1 self.assertFalse(self.process.GetThreadAtIndex(thread_index).IsValid()) self.breakpoint2.SetThreadIndex(thread_index) step_over = False self.thread.StepInstruction(step_over) self.assertEquals(self.process.GetState(), lldb.eStateStopped) self.assertEquals( self.thread.GetFrameAtIndex(0).GetPCAddress().GetLoadAddress( self.target), self.bkpt_address.GetLoadAddress( self.target)) self.assertEquals( self.thread.GetStopReason(), lldb.eStopReasonPlanComplete, "Stop reason should be 'plan complete'") self.finish_test()