1*99451b44SJordan Rupprecht""" 2*99451b44SJordan RupprechtTest that SBFrame::GetVariables() calls work correctly. 3*99451b44SJordan Rupprecht""" 4*99451b44SJordan Rupprecht 5*99451b44SJordan Rupprechtfrom __future__ import print_function 6*99451b44SJordan Rupprecht 7*99451b44SJordan Rupprecht 8*99451b44SJordan Rupprechtimport lldb 9*99451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 10*99451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 11*99451b44SJordan Rupprechtfrom lldbsuite.test import lldbplatform 12*99451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 13*99451b44SJordan Rupprecht 14*99451b44SJordan Rupprecht 15*99451b44SJordan Rupprechtdef get_names_from_value_list(value_list): 16*99451b44SJordan Rupprecht names = list() 17*99451b44SJordan Rupprecht for value in value_list: 18*99451b44SJordan Rupprecht names.append(value.GetName()) 19*99451b44SJordan Rupprecht return names 20*99451b44SJordan Rupprecht 21*99451b44SJordan Rupprecht 22*99451b44SJordan Rupprechtclass TestGetVariables(TestBase): 23*99451b44SJordan Rupprecht 24*99451b44SJordan Rupprecht mydir = TestBase.compute_mydir(__file__) 25*99451b44SJordan Rupprecht 26*99451b44SJordan Rupprecht def setUp(self): 27*99451b44SJordan Rupprecht # Call super's setUp(). 28*99451b44SJordan Rupprecht TestBase.setUp(self) 29*99451b44SJordan Rupprecht self.source = 'main.c' 30*99451b44SJordan Rupprecht 31*99451b44SJordan Rupprecht def verify_variable_names(self, description, value_list, names): 32*99451b44SJordan Rupprecht copy_names = list(names) 33*99451b44SJordan Rupprecht actual_names = get_names_from_value_list(value_list) 34*99451b44SJordan Rupprecht for name in actual_names: 35*99451b44SJordan Rupprecht if name in copy_names: 36*99451b44SJordan Rupprecht copy_names.remove(name) 37*99451b44SJordan Rupprecht else: 38*99451b44SJordan Rupprecht self.assertTrue( 39*99451b44SJordan Rupprecht False, "didn't find '%s' in %s" % 40*99451b44SJordan Rupprecht (name, copy_names)) 41*99451b44SJordan Rupprecht self.assertEqual( 42*99451b44SJordan Rupprecht len(copy_names), 0, "%s: we didn't find variables: %s in value list (%s)" % 43*99451b44SJordan Rupprecht (description, copy_names, actual_names)) 44*99451b44SJordan Rupprecht 45*99451b44SJordan Rupprecht def test(self): 46*99451b44SJordan Rupprecht self.build() 47*99451b44SJordan Rupprecht 48*99451b44SJordan Rupprecht # Set debugger into synchronous mode 49*99451b44SJordan Rupprecht self.dbg.SetAsync(False) 50*99451b44SJordan Rupprecht 51*99451b44SJordan Rupprecht # Create a target by the debugger. 52*99451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 53*99451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 54*99451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 55*99451b44SJordan Rupprecht 56*99451b44SJordan Rupprecht line1 = line_number(self.source, '// breakpoint 1') 57*99451b44SJordan Rupprecht line2 = line_number(self.source, '// breakpoint 2') 58*99451b44SJordan Rupprecht line3 = line_number(self.source, '// breakpoint 3') 59*99451b44SJordan Rupprecht 60*99451b44SJordan Rupprecht breakpoint1 = target.BreakpointCreateByLocation(self.source, line1) 61*99451b44SJordan Rupprecht breakpoint2 = target.BreakpointCreateByLocation(self.source, line2) 62*99451b44SJordan Rupprecht breakpoint3 = target.BreakpointCreateByLocation(self.source, line3) 63*99451b44SJordan Rupprecht 64*99451b44SJordan Rupprecht self.assertTrue(breakpoint1.GetNumLocations() >= 1, PROCESS_IS_VALID) 65*99451b44SJordan Rupprecht self.assertTrue(breakpoint2.GetNumLocations() >= 1, PROCESS_IS_VALID) 66*99451b44SJordan Rupprecht self.assertTrue(breakpoint3.GetNumLocations() >= 1, PROCESS_IS_VALID) 67*99451b44SJordan Rupprecht 68*99451b44SJordan Rupprecht # Register our shared libraries for remote targets so they get 69*99451b44SJordan Rupprecht # automatically uploaded 70*99451b44SJordan Rupprecht arguments = None 71*99451b44SJordan Rupprecht environment = None 72*99451b44SJordan Rupprecht 73*99451b44SJordan Rupprecht # Now launch the process, and do not stop at entry point. 74*99451b44SJordan Rupprecht process = target.LaunchSimple( 75*99451b44SJordan Rupprecht arguments, environment, self.get_process_working_directory()) 76*99451b44SJordan Rupprecht self.assertTrue(process, PROCESS_IS_VALID) 77*99451b44SJordan Rupprecht 78*99451b44SJordan Rupprecht threads = lldbutil.get_threads_stopped_at_breakpoint( 79*99451b44SJordan Rupprecht process, breakpoint1) 80*99451b44SJordan Rupprecht self.assertEqual( 81*99451b44SJordan Rupprecht len(threads), 82*99451b44SJordan Rupprecht 1, 83*99451b44SJordan Rupprecht "There should be a thread stopped at breakpoint 1") 84*99451b44SJordan Rupprecht 85*99451b44SJordan Rupprecht thread = threads[0] 86*99451b44SJordan Rupprecht self.assertTrue(thread.IsValid(), "Thread must be valid") 87*99451b44SJordan Rupprecht frame = thread.GetFrameAtIndex(0) 88*99451b44SJordan Rupprecht self.assertTrue(frame.IsValid(), "Frame must be valid") 89*99451b44SJordan Rupprecht 90*99451b44SJordan Rupprecht arg_names = ['argc', 'argv'] 91*99451b44SJordan Rupprecht local_names = ['i', 'j', 'k'] 92*99451b44SJordan Rupprecht static_names = ['static_var', 'g_global_var', 'g_static_var'] 93*99451b44SJordan Rupprecht breakpoint1_locals = ['i'] 94*99451b44SJordan Rupprecht breakpoint1_statics = ['static_var'] 95*99451b44SJordan Rupprecht num_args = len(arg_names) 96*99451b44SJordan Rupprecht num_locals = len(local_names) 97*99451b44SJordan Rupprecht num_statics = len(static_names) 98*99451b44SJordan Rupprecht args_yes = True 99*99451b44SJordan Rupprecht args_no = False 100*99451b44SJordan Rupprecht locals_yes = True 101*99451b44SJordan Rupprecht locals_no = False 102*99451b44SJordan Rupprecht statics_yes = True 103*99451b44SJordan Rupprecht statics_no = False 104*99451b44SJordan Rupprecht in_scopy_only = True 105*99451b44SJordan Rupprecht ignore_scope = False 106*99451b44SJordan Rupprecht 107*99451b44SJordan Rupprecht # Verify if we ask for only arguments that we got what we expect 108*99451b44SJordan Rupprecht vars = frame.GetVariables( 109*99451b44SJordan Rupprecht args_yes, locals_no, statics_no, ignore_scope) 110*99451b44SJordan Rupprecht self.assertEqual( 111*99451b44SJordan Rupprecht vars.GetSize(), 112*99451b44SJordan Rupprecht num_args, 113*99451b44SJordan Rupprecht "There should be %i arguments, but we are reporting %i" % 114*99451b44SJordan Rupprecht (num_args, 115*99451b44SJordan Rupprecht vars.GetSize())) 116*99451b44SJordan Rupprecht self.verify_variable_names("check names of arguments", vars, arg_names) 117*99451b44SJordan Rupprecht self.assertEqual( 118*99451b44SJordan Rupprecht len(arg_names), 119*99451b44SJordan Rupprecht num_args, 120*99451b44SJordan Rupprecht "make sure verify_variable_names() didn't mutate list") 121*99451b44SJordan Rupprecht 122*99451b44SJordan Rupprecht # Verify if we ask for only locals that we got what we expect 123*99451b44SJordan Rupprecht vars = frame.GetVariables( 124*99451b44SJordan Rupprecht args_no, locals_yes, statics_no, ignore_scope) 125*99451b44SJordan Rupprecht self.assertEqual( 126*99451b44SJordan Rupprecht vars.GetSize(), 127*99451b44SJordan Rupprecht num_locals, 128*99451b44SJordan Rupprecht "There should be %i local variables, but we are reporting %i" % 129*99451b44SJordan Rupprecht (num_locals, 130*99451b44SJordan Rupprecht vars.GetSize())) 131*99451b44SJordan Rupprecht self.verify_variable_names("check names of locals", vars, local_names) 132*99451b44SJordan Rupprecht 133*99451b44SJordan Rupprecht # Verify if we ask for only statics that we got what we expect 134*99451b44SJordan Rupprecht vars = frame.GetVariables( 135*99451b44SJordan Rupprecht args_no, locals_no, statics_yes, ignore_scope) 136*99451b44SJordan Rupprecht print('statics: ', str(vars)) 137*99451b44SJordan Rupprecht self.assertEqual( 138*99451b44SJordan Rupprecht vars.GetSize(), 139*99451b44SJordan Rupprecht num_statics, 140*99451b44SJordan Rupprecht "There should be %i static variables, but we are reporting %i" % 141*99451b44SJordan Rupprecht (num_statics, 142*99451b44SJordan Rupprecht vars.GetSize())) 143*99451b44SJordan Rupprecht self.verify_variable_names( 144*99451b44SJordan Rupprecht "check names of statics", vars, static_names) 145*99451b44SJordan Rupprecht 146*99451b44SJordan Rupprecht # Verify if we ask for arguments and locals that we got what we expect 147*99451b44SJordan Rupprecht vars = frame.GetVariables( 148*99451b44SJordan Rupprecht args_yes, locals_yes, statics_no, ignore_scope) 149*99451b44SJordan Rupprecht desc = 'arguments + locals' 150*99451b44SJordan Rupprecht names = arg_names + local_names 151*99451b44SJordan Rupprecht count = len(names) 152*99451b44SJordan Rupprecht self.assertEqual( 153*99451b44SJordan Rupprecht vars.GetSize(), 154*99451b44SJordan Rupprecht count, 155*99451b44SJordan Rupprecht "There should be %i %s (%s) but we are reporting %i (%s)" % 156*99451b44SJordan Rupprecht (count, 157*99451b44SJordan Rupprecht desc, 158*99451b44SJordan Rupprecht names, 159*99451b44SJordan Rupprecht vars.GetSize(), 160*99451b44SJordan Rupprecht get_names_from_value_list(vars))) 161*99451b44SJordan Rupprecht self.verify_variable_names("check names of %s" % (desc), vars, names) 162*99451b44SJordan Rupprecht 163*99451b44SJordan Rupprecht # Verify if we ask for arguments and statics that we got what we expect 164*99451b44SJordan Rupprecht vars = frame.GetVariables( 165*99451b44SJordan Rupprecht args_yes, locals_no, statics_yes, ignore_scope) 166*99451b44SJordan Rupprecht desc = 'arguments + statics' 167*99451b44SJordan Rupprecht names = arg_names + static_names 168*99451b44SJordan Rupprecht count = len(names) 169*99451b44SJordan Rupprecht self.assertEqual( 170*99451b44SJordan Rupprecht vars.GetSize(), 171*99451b44SJordan Rupprecht count, 172*99451b44SJordan Rupprecht "There should be %i %s (%s) but we are reporting %i (%s)" % 173*99451b44SJordan Rupprecht (count, 174*99451b44SJordan Rupprecht desc, 175*99451b44SJordan Rupprecht names, 176*99451b44SJordan Rupprecht vars.GetSize(), 177*99451b44SJordan Rupprecht get_names_from_value_list(vars))) 178*99451b44SJordan Rupprecht self.verify_variable_names("check names of %s" % (desc), vars, names) 179*99451b44SJordan Rupprecht 180*99451b44SJordan Rupprecht # Verify if we ask for locals and statics that we got what we expect 181*99451b44SJordan Rupprecht vars = frame.GetVariables( 182*99451b44SJordan Rupprecht args_no, locals_yes, statics_yes, ignore_scope) 183*99451b44SJordan Rupprecht desc = 'locals + statics' 184*99451b44SJordan Rupprecht names = local_names + static_names 185*99451b44SJordan Rupprecht count = len(names) 186*99451b44SJordan Rupprecht self.assertEqual( 187*99451b44SJordan Rupprecht vars.GetSize(), 188*99451b44SJordan Rupprecht count, 189*99451b44SJordan Rupprecht "There should be %i %s (%s) but we are reporting %i (%s)" % 190*99451b44SJordan Rupprecht (count, 191*99451b44SJordan Rupprecht desc, 192*99451b44SJordan Rupprecht names, 193*99451b44SJordan Rupprecht vars.GetSize(), 194*99451b44SJordan Rupprecht get_names_from_value_list(vars))) 195*99451b44SJordan Rupprecht self.verify_variable_names("check names of %s" % (desc), vars, names) 196*99451b44SJordan Rupprecht 197*99451b44SJordan Rupprecht # Verify if we ask for arguments, locals and statics that we got what 198*99451b44SJordan Rupprecht # we expect 199*99451b44SJordan Rupprecht vars = frame.GetVariables( 200*99451b44SJordan Rupprecht args_yes, locals_yes, statics_yes, ignore_scope) 201*99451b44SJordan Rupprecht desc = 'arguments + locals + statics' 202*99451b44SJordan Rupprecht names = arg_names + local_names + static_names 203*99451b44SJordan Rupprecht count = len(names) 204*99451b44SJordan Rupprecht self.assertEqual( 205*99451b44SJordan Rupprecht vars.GetSize(), 206*99451b44SJordan Rupprecht count, 207*99451b44SJordan Rupprecht "There should be %i %s (%s) but we are reporting %i (%s)" % 208*99451b44SJordan Rupprecht (count, 209*99451b44SJordan Rupprecht desc, 210*99451b44SJordan Rupprecht names, 211*99451b44SJordan Rupprecht vars.GetSize(), 212*99451b44SJordan Rupprecht get_names_from_value_list(vars))) 213*99451b44SJordan Rupprecht self.verify_variable_names("check names of %s" % (desc), vars, names) 214*99451b44SJordan Rupprecht 215*99451b44SJordan Rupprecht # Verify if we ask for in scope locals that we got what we expect 216*99451b44SJordan Rupprecht vars = frame.GetVariables( 217*99451b44SJordan Rupprecht args_no, locals_yes, statics_no, in_scopy_only) 218*99451b44SJordan Rupprecht desc = 'in scope locals at breakpoint 1' 219*99451b44SJordan Rupprecht names = ['i'] 220*99451b44SJordan Rupprecht count = len(names) 221*99451b44SJordan Rupprecht self.assertEqual( 222*99451b44SJordan Rupprecht vars.GetSize(), 223*99451b44SJordan Rupprecht count, 224*99451b44SJordan Rupprecht "There should be %i %s (%s) but we are reporting %i (%s)" % 225*99451b44SJordan Rupprecht (count, 226*99451b44SJordan Rupprecht desc, 227*99451b44SJordan Rupprecht names, 228*99451b44SJordan Rupprecht vars.GetSize(), 229*99451b44SJordan Rupprecht get_names_from_value_list(vars))) 230*99451b44SJordan Rupprecht self.verify_variable_names("check names of %s" % (desc), vars, names) 231*99451b44SJordan Rupprecht 232*99451b44SJordan Rupprecht # Continue to breakpoint 2 233*99451b44SJordan Rupprecht process.Continue() 234*99451b44SJordan Rupprecht 235*99451b44SJordan Rupprecht threads = lldbutil.get_threads_stopped_at_breakpoint( 236*99451b44SJordan Rupprecht process, breakpoint2) 237*99451b44SJordan Rupprecht self.assertEqual( 238*99451b44SJordan Rupprecht len(threads), 239*99451b44SJordan Rupprecht 1, 240*99451b44SJordan Rupprecht "There should be a thread stopped at breakpoint 2") 241*99451b44SJordan Rupprecht 242*99451b44SJordan Rupprecht thread = threads[0] 243*99451b44SJordan Rupprecht self.assertTrue(thread.IsValid(), "Thread must be valid") 244*99451b44SJordan Rupprecht frame = thread.GetFrameAtIndex(0) 245*99451b44SJordan Rupprecht self.assertTrue(frame.IsValid(), "Frame must be valid") 246*99451b44SJordan Rupprecht 247*99451b44SJordan Rupprecht # Verify if we ask for in scope locals that we got what we expect 248*99451b44SJordan Rupprecht vars = frame.GetVariables( 249*99451b44SJordan Rupprecht args_no, locals_yes, statics_no, in_scopy_only) 250*99451b44SJordan Rupprecht desc = 'in scope locals at breakpoint 2' 251*99451b44SJordan Rupprecht names = ['i', 'j'] 252*99451b44SJordan Rupprecht count = len(names) 253*99451b44SJordan Rupprecht self.assertEqual( 254*99451b44SJordan Rupprecht vars.GetSize(), 255*99451b44SJordan Rupprecht count, 256*99451b44SJordan Rupprecht "There should be %i %s (%s) but we are reporting %i (%s)" % 257*99451b44SJordan Rupprecht (count, 258*99451b44SJordan Rupprecht desc, 259*99451b44SJordan Rupprecht names, 260*99451b44SJordan Rupprecht vars.GetSize(), 261*99451b44SJordan Rupprecht get_names_from_value_list(vars))) 262*99451b44SJordan Rupprecht self.verify_variable_names("check names of %s" % (desc), vars, names) 263*99451b44SJordan Rupprecht 264*99451b44SJordan Rupprecht # Continue to breakpoint 3 265*99451b44SJordan Rupprecht process.Continue() 266*99451b44SJordan Rupprecht 267*99451b44SJordan Rupprecht threads = lldbutil.get_threads_stopped_at_breakpoint( 268*99451b44SJordan Rupprecht process, breakpoint3) 269*99451b44SJordan Rupprecht self.assertEqual( 270*99451b44SJordan Rupprecht len(threads), 271*99451b44SJordan Rupprecht 1, 272*99451b44SJordan Rupprecht "There should be a thread stopped at breakpoint 3") 273*99451b44SJordan Rupprecht 274*99451b44SJordan Rupprecht thread = threads[0] 275*99451b44SJordan Rupprecht self.assertTrue(thread.IsValid(), "Thread must be valid") 276*99451b44SJordan Rupprecht frame = thread.GetFrameAtIndex(0) 277*99451b44SJordan Rupprecht self.assertTrue(frame.IsValid(), "Frame must be valid") 278*99451b44SJordan Rupprecht 279*99451b44SJordan Rupprecht # Verify if we ask for in scope locals that we got what we expect 280*99451b44SJordan Rupprecht vars = frame.GetVariables( 281*99451b44SJordan Rupprecht args_no, locals_yes, statics_no, in_scopy_only) 282*99451b44SJordan Rupprecht desc = 'in scope locals at breakpoint 3' 283*99451b44SJordan Rupprecht names = ['i', 'j', 'k'] 284*99451b44SJordan Rupprecht count = len(names) 285*99451b44SJordan Rupprecht self.assertEqual( 286*99451b44SJordan Rupprecht vars.GetSize(), 287*99451b44SJordan Rupprecht count, 288*99451b44SJordan Rupprecht "There should be %i %s (%s) but we are reporting %i (%s)" % 289*99451b44SJordan Rupprecht (count, 290*99451b44SJordan Rupprecht desc, 291*99451b44SJordan Rupprecht names, 292*99451b44SJordan Rupprecht vars.GetSize(), 293*99451b44SJordan Rupprecht get_names_from_value_list(vars))) 294*99451b44SJordan Rupprecht self.verify_variable_names("check names of %s" % (desc), vars, names) 295