199451b44SJordan Rupprecht""" 299451b44SJordan RupprechtTest that SBFrame::GetVariables() calls work correctly. 399451b44SJordan Rupprecht""" 499451b44SJordan Rupprecht 599451b44SJordan Rupprechtimport lldb 699451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 799451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 899451b44SJordan Rupprechtfrom lldbsuite.test import lldbplatform 999451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 1099451b44SJordan Rupprecht 1199451b44SJordan Rupprecht 1299451b44SJordan Rupprechtdef get_names_from_value_list(value_list): 1399451b44SJordan Rupprecht names = list() 1499451b44SJordan Rupprecht for value in value_list: 1599451b44SJordan Rupprecht names.append(value.GetName()) 1699451b44SJordan Rupprecht return names 1799451b44SJordan Rupprecht 1899451b44SJordan Rupprecht 1999451b44SJordan Rupprechtclass TestGetVariables(TestBase): 2099451b44SJordan Rupprecht def setUp(self): 2199451b44SJordan Rupprecht # Call super's setUp(). 2299451b44SJordan Rupprecht TestBase.setUp(self) 232238dcc3SJonas Devlieghere self.source = "main.c" 2499451b44SJordan Rupprecht 2599451b44SJordan Rupprecht def verify_variable_names(self, description, value_list, names): 2699451b44SJordan Rupprecht copy_names = list(names) 2799451b44SJordan Rupprecht actual_names = get_names_from_value_list(value_list) 2899451b44SJordan Rupprecht for name in actual_names: 2999451b44SJordan Rupprecht if name in copy_names: 3099451b44SJordan Rupprecht copy_names.remove(name) 3199451b44SJordan Rupprecht else: 322238dcc3SJonas Devlieghere self.assertTrue(False, "didn't find '%s' in %s" % (name, copy_names)) 3399451b44SJordan Rupprecht self.assertEqual( 342238dcc3SJonas Devlieghere len(copy_names), 352238dcc3SJonas Devlieghere 0, 362238dcc3SJonas Devlieghere "%s: we didn't find variables: %s in value list (%s)" 372238dcc3SJonas Devlieghere % (description, copy_names, actual_names), 382238dcc3SJonas Devlieghere ) 3999451b44SJordan Rupprecht 4099451b44SJordan Rupprecht def test(self): 4199451b44SJordan Rupprecht self.build() 4299451b44SJordan Rupprecht 4399451b44SJordan Rupprecht # Set debugger into synchronous mode 4499451b44SJordan Rupprecht self.dbg.SetAsync(False) 4599451b44SJordan Rupprecht 4699451b44SJordan Rupprecht # Create a target by the debugger. 4799451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 4899451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 4999451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 5099451b44SJordan Rupprecht 512238dcc3SJonas Devlieghere line1 = line_number(self.source, "// breakpoint 1") 522238dcc3SJonas Devlieghere line2 = line_number(self.source, "// breakpoint 2") 532238dcc3SJonas Devlieghere line3 = line_number(self.source, "// breakpoint 3") 5499451b44SJordan Rupprecht 5599451b44SJordan Rupprecht breakpoint1 = target.BreakpointCreateByLocation(self.source, line1) 5699451b44SJordan Rupprecht breakpoint2 = target.BreakpointCreateByLocation(self.source, line2) 5799451b44SJordan Rupprecht breakpoint3 = target.BreakpointCreateByLocation(self.source, line3) 5899451b44SJordan Rupprecht 59*9c246882SJordan Rupprecht self.assertGreaterEqual(breakpoint1.GetNumLocations(), 1, PROCESS_IS_VALID) 60*9c246882SJordan Rupprecht self.assertGreaterEqual(breakpoint2.GetNumLocations(), 1, PROCESS_IS_VALID) 61*9c246882SJordan Rupprecht self.assertGreaterEqual(breakpoint3.GetNumLocations(), 1, PROCESS_IS_VALID) 6299451b44SJordan Rupprecht 6399451b44SJordan Rupprecht # Register our shared libraries for remote targets so they get 6499451b44SJordan Rupprecht # automatically uploaded 6599451b44SJordan Rupprecht arguments = None 6699451b44SJordan Rupprecht environment = None 6799451b44SJordan Rupprecht 6899451b44SJordan Rupprecht # Now launch the process, and do not stop at entry point. 6999451b44SJordan Rupprecht process = target.LaunchSimple( 702238dcc3SJonas Devlieghere arguments, environment, self.get_process_working_directory() 712238dcc3SJonas Devlieghere ) 7299451b44SJordan Rupprecht self.assertTrue(process, PROCESS_IS_VALID) 7399451b44SJordan Rupprecht 742238dcc3SJonas Devlieghere threads = lldbutil.get_threads_stopped_at_breakpoint(process, breakpoint1) 7599451b44SJordan Rupprecht self.assertEqual( 762238dcc3SJonas Devlieghere len(threads), 1, "There should be a thread stopped at breakpoint 1" 772238dcc3SJonas Devlieghere ) 7899451b44SJordan Rupprecht 7999451b44SJordan Rupprecht thread = threads[0] 8099451b44SJordan Rupprecht self.assertTrue(thread.IsValid(), "Thread must be valid") 8199451b44SJordan Rupprecht frame = thread.GetFrameAtIndex(0) 8299451b44SJordan Rupprecht self.assertTrue(frame.IsValid(), "Frame must be valid") 8399451b44SJordan Rupprecht 842238dcc3SJonas Devlieghere arg_names = ["argc", "argv"] 852238dcc3SJonas Devlieghere local_names = ["i", "j", "k"] 862238dcc3SJonas Devlieghere static_names = ["static_var", "g_global_var", "g_static_var"] 872238dcc3SJonas Devlieghere breakpoint1_locals = ["i"] 882238dcc3SJonas Devlieghere breakpoint1_statics = ["static_var"] 8999451b44SJordan Rupprecht num_args = len(arg_names) 9099451b44SJordan Rupprecht num_locals = len(local_names) 9199451b44SJordan Rupprecht num_statics = len(static_names) 9299451b44SJordan Rupprecht args_yes = True 9399451b44SJordan Rupprecht args_no = False 9499451b44SJordan Rupprecht locals_yes = True 9599451b44SJordan Rupprecht locals_no = False 9699451b44SJordan Rupprecht statics_yes = True 9799451b44SJordan Rupprecht statics_no = False 9899451b44SJordan Rupprecht in_scopy_only = True 9999451b44SJordan Rupprecht ignore_scope = False 10099451b44SJordan Rupprecht 10199451b44SJordan Rupprecht # Verify if we ask for only arguments that we got what we expect 1022238dcc3SJonas Devlieghere vars = frame.GetVariables(args_yes, locals_no, statics_no, ignore_scope) 10399451b44SJordan Rupprecht self.assertEqual( 10499451b44SJordan Rupprecht vars.GetSize(), 10599451b44SJordan Rupprecht num_args, 1062238dcc3SJonas Devlieghere "There should be %i arguments, but we are reporting %i" 1072238dcc3SJonas Devlieghere % (num_args, vars.GetSize()), 1082238dcc3SJonas Devlieghere ) 10999451b44SJordan Rupprecht self.verify_variable_names("check names of arguments", vars, arg_names) 11099451b44SJordan Rupprecht self.assertEqual( 11199451b44SJordan Rupprecht len(arg_names), 11299451b44SJordan Rupprecht num_args, 1132238dcc3SJonas Devlieghere "make sure verify_variable_names() didn't mutate list", 1142238dcc3SJonas Devlieghere ) 11599451b44SJordan Rupprecht 11699451b44SJordan Rupprecht # Verify if we ask for only locals that we got what we expect 1172238dcc3SJonas Devlieghere vars = frame.GetVariables(args_no, locals_yes, statics_no, ignore_scope) 11899451b44SJordan Rupprecht self.assertEqual( 11999451b44SJordan Rupprecht vars.GetSize(), 12099451b44SJordan Rupprecht num_locals, 1212238dcc3SJonas Devlieghere "There should be %i local variables, but we are reporting %i" 1222238dcc3SJonas Devlieghere % (num_locals, vars.GetSize()), 1232238dcc3SJonas Devlieghere ) 12499451b44SJordan Rupprecht self.verify_variable_names("check names of locals", vars, local_names) 12599451b44SJordan Rupprecht 12699451b44SJordan Rupprecht # Verify if we ask for only statics that we got what we expect 1272238dcc3SJonas Devlieghere vars = frame.GetVariables(args_no, locals_no, statics_yes, ignore_scope) 1282238dcc3SJonas Devlieghere print("statics: ", str(vars)) 12999451b44SJordan Rupprecht self.assertEqual( 13099451b44SJordan Rupprecht vars.GetSize(), 13199451b44SJordan Rupprecht num_statics, 1322238dcc3SJonas Devlieghere "There should be %i static variables, but we are reporting %i" 1332238dcc3SJonas Devlieghere % (num_statics, vars.GetSize()), 1342238dcc3SJonas Devlieghere ) 1352238dcc3SJonas Devlieghere self.verify_variable_names("check names of statics", vars, static_names) 13699451b44SJordan Rupprecht 13799451b44SJordan Rupprecht # Verify if we ask for arguments and locals that we got what we expect 1382238dcc3SJonas Devlieghere vars = frame.GetVariables(args_yes, locals_yes, statics_no, ignore_scope) 1392238dcc3SJonas Devlieghere desc = "arguments + locals" 14099451b44SJordan Rupprecht names = arg_names + local_names 14199451b44SJordan Rupprecht count = len(names) 14299451b44SJordan Rupprecht self.assertEqual( 14399451b44SJordan Rupprecht vars.GetSize(), 14499451b44SJordan Rupprecht count, 1452238dcc3SJonas Devlieghere "There should be %i %s (%s) but we are reporting %i (%s)" 1462238dcc3SJonas Devlieghere % (count, desc, names, vars.GetSize(), get_names_from_value_list(vars)), 1472238dcc3SJonas Devlieghere ) 14899451b44SJordan Rupprecht self.verify_variable_names("check names of %s" % (desc), vars, names) 14999451b44SJordan Rupprecht 15099451b44SJordan Rupprecht # Verify if we ask for arguments and statics that we got what we expect 1512238dcc3SJonas Devlieghere vars = frame.GetVariables(args_yes, locals_no, statics_yes, ignore_scope) 1522238dcc3SJonas Devlieghere desc = "arguments + statics" 15399451b44SJordan Rupprecht names = arg_names + static_names 15499451b44SJordan Rupprecht count = len(names) 15599451b44SJordan Rupprecht self.assertEqual( 15699451b44SJordan Rupprecht vars.GetSize(), 15799451b44SJordan Rupprecht count, 1582238dcc3SJonas Devlieghere "There should be %i %s (%s) but we are reporting %i (%s)" 1592238dcc3SJonas Devlieghere % (count, desc, names, vars.GetSize(), get_names_from_value_list(vars)), 1602238dcc3SJonas Devlieghere ) 16199451b44SJordan Rupprecht self.verify_variable_names("check names of %s" % (desc), vars, names) 16299451b44SJordan Rupprecht 16399451b44SJordan Rupprecht # Verify if we ask for locals and statics that we got what we expect 1642238dcc3SJonas Devlieghere vars = frame.GetVariables(args_no, locals_yes, statics_yes, ignore_scope) 1652238dcc3SJonas Devlieghere desc = "locals + statics" 16699451b44SJordan Rupprecht names = local_names + static_names 16799451b44SJordan Rupprecht count = len(names) 16899451b44SJordan Rupprecht self.assertEqual( 16999451b44SJordan Rupprecht vars.GetSize(), 17099451b44SJordan Rupprecht count, 1712238dcc3SJonas Devlieghere "There should be %i %s (%s) but we are reporting %i (%s)" 1722238dcc3SJonas Devlieghere % (count, desc, names, vars.GetSize(), get_names_from_value_list(vars)), 1732238dcc3SJonas Devlieghere ) 17499451b44SJordan Rupprecht self.verify_variable_names("check names of %s" % (desc), vars, names) 17599451b44SJordan Rupprecht 17699451b44SJordan Rupprecht # Verify if we ask for arguments, locals and statics that we got what 17799451b44SJordan Rupprecht # we expect 1782238dcc3SJonas Devlieghere vars = frame.GetVariables(args_yes, locals_yes, statics_yes, ignore_scope) 1792238dcc3SJonas Devlieghere desc = "arguments + locals + statics" 18099451b44SJordan Rupprecht names = arg_names + local_names + static_names 18199451b44SJordan Rupprecht count = len(names) 18299451b44SJordan Rupprecht self.assertEqual( 18399451b44SJordan Rupprecht vars.GetSize(), 18499451b44SJordan Rupprecht count, 1852238dcc3SJonas Devlieghere "There should be %i %s (%s) but we are reporting %i (%s)" 1862238dcc3SJonas Devlieghere % (count, desc, names, vars.GetSize(), get_names_from_value_list(vars)), 1872238dcc3SJonas Devlieghere ) 18899451b44SJordan Rupprecht self.verify_variable_names("check names of %s" % (desc), vars, names) 18999451b44SJordan Rupprecht 19099451b44SJordan Rupprecht # Verify if we ask for in scope locals that we got what we expect 1912238dcc3SJonas Devlieghere vars = frame.GetVariables(args_no, locals_yes, statics_no, in_scopy_only) 1922238dcc3SJonas Devlieghere desc = "in scope locals at breakpoint 1" 1932238dcc3SJonas Devlieghere names = ["i"] 19499451b44SJordan Rupprecht count = len(names) 19599451b44SJordan Rupprecht self.assertEqual( 19699451b44SJordan Rupprecht vars.GetSize(), 19799451b44SJordan Rupprecht count, 1982238dcc3SJonas Devlieghere "There should be %i %s (%s) but we are reporting %i (%s)" 1992238dcc3SJonas Devlieghere % (count, desc, names, vars.GetSize(), get_names_from_value_list(vars)), 2002238dcc3SJonas Devlieghere ) 20199451b44SJordan Rupprecht self.verify_variable_names("check names of %s" % (desc), vars, names) 20299451b44SJordan Rupprecht 20399451b44SJordan Rupprecht # Continue to breakpoint 2 20499451b44SJordan Rupprecht process.Continue() 20599451b44SJordan Rupprecht 2062238dcc3SJonas Devlieghere threads = lldbutil.get_threads_stopped_at_breakpoint(process, breakpoint2) 20799451b44SJordan Rupprecht self.assertEqual( 2082238dcc3SJonas Devlieghere len(threads), 1, "There should be a thread stopped at breakpoint 2" 2092238dcc3SJonas Devlieghere ) 21099451b44SJordan Rupprecht 21199451b44SJordan Rupprecht thread = threads[0] 21299451b44SJordan Rupprecht self.assertTrue(thread.IsValid(), "Thread must be valid") 21399451b44SJordan Rupprecht frame = thread.GetFrameAtIndex(0) 21499451b44SJordan Rupprecht self.assertTrue(frame.IsValid(), "Frame must be valid") 21599451b44SJordan Rupprecht 21699451b44SJordan Rupprecht # Verify if we ask for in scope locals that we got what we expect 2172238dcc3SJonas Devlieghere vars = frame.GetVariables(args_no, locals_yes, statics_no, in_scopy_only) 2182238dcc3SJonas Devlieghere desc = "in scope locals at breakpoint 2" 2192238dcc3SJonas Devlieghere names = ["i", "j"] 22099451b44SJordan Rupprecht count = len(names) 22199451b44SJordan Rupprecht self.assertEqual( 22299451b44SJordan Rupprecht vars.GetSize(), 22399451b44SJordan Rupprecht count, 2242238dcc3SJonas Devlieghere "There should be %i %s (%s) but we are reporting %i (%s)" 2252238dcc3SJonas Devlieghere % (count, desc, names, vars.GetSize(), get_names_from_value_list(vars)), 2262238dcc3SJonas Devlieghere ) 22799451b44SJordan Rupprecht self.verify_variable_names("check names of %s" % (desc), vars, names) 22899451b44SJordan Rupprecht 22999451b44SJordan Rupprecht # Continue to breakpoint 3 23099451b44SJordan Rupprecht process.Continue() 23199451b44SJordan Rupprecht 2322238dcc3SJonas Devlieghere threads = lldbutil.get_threads_stopped_at_breakpoint(process, breakpoint3) 23399451b44SJordan Rupprecht self.assertEqual( 2342238dcc3SJonas Devlieghere len(threads), 1, "There should be a thread stopped at breakpoint 3" 2352238dcc3SJonas Devlieghere ) 23699451b44SJordan Rupprecht 23799451b44SJordan Rupprecht thread = threads[0] 23899451b44SJordan Rupprecht self.assertTrue(thread.IsValid(), "Thread must be valid") 23999451b44SJordan Rupprecht frame = thread.GetFrameAtIndex(0) 24099451b44SJordan Rupprecht self.assertTrue(frame.IsValid(), "Frame must be valid") 24199451b44SJordan Rupprecht 24299451b44SJordan Rupprecht # Verify if we ask for in scope locals that we got what we expect 2432238dcc3SJonas Devlieghere vars = frame.GetVariables(args_no, locals_yes, statics_no, in_scopy_only) 2442238dcc3SJonas Devlieghere desc = "in scope locals at breakpoint 3" 2452238dcc3SJonas Devlieghere names = ["i", "j", "k"] 24699451b44SJordan Rupprecht count = len(names) 24799451b44SJordan Rupprecht self.assertEqual( 24899451b44SJordan Rupprecht vars.GetSize(), 24999451b44SJordan Rupprecht count, 2502238dcc3SJonas Devlieghere "There should be %i %s (%s) but we are reporting %i (%s)" 2512238dcc3SJonas Devlieghere % (count, desc, names, vars.GetSize(), get_names_from_value_list(vars)), 2522238dcc3SJonas Devlieghere ) 25399451b44SJordan Rupprecht self.verify_variable_names("check names of %s" % (desc), vars, names) 254