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