199451b44SJordan Rupprecht"""Test the 'step target' feature.""" 299451b44SJordan Rupprecht 399451b44SJordan Rupprecht 499451b44SJordan Rupprechtimport lldb 599451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 699451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 799451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 899451b44SJordan Rupprecht 999451b44SJordan Rupprecht 1099451b44SJordan Rupprechtclass TestStepTarget(TestBase): 1199451b44SJordan Rupprecht def setUp(self): 1299451b44SJordan Rupprecht # Call super's setUp(). 1399451b44SJordan Rupprecht TestBase.setUp(self) 1499451b44SJordan Rupprecht # Find the line numbers that we will step to in main: 1599451b44SJordan Rupprecht self.main_source = "main.c" 1699451b44SJordan Rupprecht self.end_line = line_number(self.main_source, "All done") 1799451b44SJordan Rupprecht 182238dcc3SJonas Devlieghere @add_test_categories(["pyapi"]) 1999451b44SJordan Rupprecht def get_to_start(self): 2099451b44SJordan Rupprecht self.build() 2199451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 2299451b44SJordan Rupprecht 2399451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 2499451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 2599451b44SJordan Rupprecht 2699451b44SJordan Rupprecht self.main_source_spec = lldb.SBFileSpec(self.main_source) 2799451b44SJordan Rupprecht 2899451b44SJordan Rupprecht break_in_main = target.BreakpointCreateBySourceRegex( 292238dcc3SJonas Devlieghere "Break here to try targetted stepping", self.main_source_spec 302238dcc3SJonas Devlieghere ) 3199451b44SJordan Rupprecht self.assertTrue(break_in_main, VALID_BREAKPOINT) 3299451b44SJordan Rupprecht self.assertGreater(break_in_main.GetNumLocations(), 0, "Has locations.") 3399451b44SJordan Rupprecht 3499451b44SJordan Rupprecht # Now launch the process, and do not stop at entry point. 352238dcc3SJonas Devlieghere process = target.LaunchSimple(None, None, self.get_process_working_directory()) 3699451b44SJordan Rupprecht 3799451b44SJordan Rupprecht self.assertTrue(process, PROCESS_IS_VALID) 3899451b44SJordan Rupprecht 3999451b44SJordan Rupprecht # The stop reason of the thread should be breakpoint. 402238dcc3SJonas Devlieghere threads = lldbutil.get_threads_stopped_at_breakpoint(process, break_in_main) 4199451b44SJordan Rupprecht 4299451b44SJordan Rupprecht if len(threads) != 1: 4399451b44SJordan Rupprecht self.fail("Failed to stop at first breakpoint in main.") 4499451b44SJordan Rupprecht 4599451b44SJordan Rupprecht thread = threads[0] 4699451b44SJordan Rupprecht return thread 4799451b44SJordan Rupprecht 48*ab05d913Stcwg @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr32343") 4999451b44SJordan Rupprecht def test_with_end_line(self): 5099451b44SJordan Rupprecht """Test stepping over vrs. hitting breakpoints & subsequent stepping in various forms.""" 5199451b44SJordan Rupprecht 5299451b44SJordan Rupprecht thread = self.get_to_start() 5399451b44SJordan Rupprecht 5499451b44SJordan Rupprecht error = lldb.SBError() 5599451b44SJordan Rupprecht thread.StepInto("lotsOfArgs", self.end_line, error) 5699451b44SJordan Rupprecht frame = thread.frames[0] 5799451b44SJordan Rupprecht 5899451b44SJordan Rupprecht self.assertEqual(frame.name, "lotsOfArgs", "Stepped to lotsOfArgs.") 5999451b44SJordan Rupprecht 60*ab05d913Stcwg @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr32343") 6199451b44SJordan Rupprecht def test_with_end_line_bad_name(self): 6299451b44SJordan Rupprecht """Test stepping over vrs. hitting breakpoints & subsequent stepping in various forms.""" 6399451b44SJordan Rupprecht 6499451b44SJordan Rupprecht thread = self.get_to_start() 6599451b44SJordan Rupprecht 6699451b44SJordan Rupprecht error = lldb.SBError() 6799451b44SJordan Rupprecht thread.StepInto("lotsOfArgssss", self.end_line, error) 6899451b44SJordan Rupprecht frame = thread.frames[0] 692238dcc3SJonas Devlieghere self.assertEqual( 702238dcc3SJonas Devlieghere frame.line_entry.line, self.end_line, "Stepped to the block end." 712238dcc3SJonas Devlieghere ) 7299451b44SJordan Rupprecht 7399451b44SJordan Rupprecht def test_with_end_line_deeper(self): 7499451b44SJordan Rupprecht """Test stepping over vrs. hitting breakpoints & subsequent stepping in various forms.""" 7599451b44SJordan Rupprecht 7699451b44SJordan Rupprecht thread = self.get_to_start() 7799451b44SJordan Rupprecht 7899451b44SJordan Rupprecht error = lldb.SBError() 7999451b44SJordan Rupprecht thread.StepInto("modifyInt", self.end_line, error) 8099451b44SJordan Rupprecht frame = thread.frames[0] 8199451b44SJordan Rupprecht self.assertEqual(frame.name, "modifyInt", "Stepped to modifyInt.") 8299451b44SJordan Rupprecht 83*ab05d913Stcwg @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr32343") 8499451b44SJordan Rupprecht def test_with_command_and_block(self): 8599451b44SJordan Rupprecht """Test stepping over vrs. hitting breakpoints & subsequent stepping in various forms.""" 8699451b44SJordan Rupprecht 8799451b44SJordan Rupprecht thread = self.get_to_start() 8899451b44SJordan Rupprecht 8999451b44SJordan Rupprecht result = lldb.SBCommandReturnObject() 9099451b44SJordan Rupprecht self.dbg.GetCommandInterpreter().HandleCommand( 912238dcc3SJonas Devlieghere 'thread step-in -t "lotsOfArgs" -e block', result 922238dcc3SJonas Devlieghere ) 932238dcc3SJonas Devlieghere self.assertTrue(result.Succeeded(), "thread step-in command succeeded.") 9499451b44SJordan Rupprecht 9599451b44SJordan Rupprecht frame = thread.frames[0] 9699451b44SJordan Rupprecht self.assertEqual(frame.name, "lotsOfArgs", "Stepped to lotsOfArgs.") 9799451b44SJordan Rupprecht 98*ab05d913Stcwg @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr32343") 9999451b44SJordan Rupprecht def test_with_command_and_block_and_bad_name(self): 10099451b44SJordan Rupprecht """Test stepping over vrs. hitting breakpoints & subsequent stepping in various forms.""" 10199451b44SJordan Rupprecht 10299451b44SJordan Rupprecht thread = self.get_to_start() 10399451b44SJordan Rupprecht 10499451b44SJordan Rupprecht result = lldb.SBCommandReturnObject() 10599451b44SJordan Rupprecht self.dbg.GetCommandInterpreter().HandleCommand( 1062238dcc3SJonas Devlieghere 'thread step-in -t "lotsOfArgsssss" -e block', result 1072238dcc3SJonas Devlieghere ) 1082238dcc3SJonas Devlieghere self.assertTrue(result.Succeeded(), "thread step-in command succeeded.") 10999451b44SJordan Rupprecht 11099451b44SJordan Rupprecht frame = thread.frames[0] 11199451b44SJordan Rupprecht 11299451b44SJordan Rupprecht self.assertEqual(frame.name, "main", "Stepped back out to main.") 11399451b44SJordan Rupprecht # end_line is set to the line after the containing block. Check that 11499451b44SJordan Rupprecht # we got there: 1152238dcc3SJonas Devlieghere self.assertEqual(frame.line_entry.line, self.end_line, "Got out of the block") 116