199451b44SJordan Rupprecht""" 299451b44SJordan RupprechtTest that objective-c constant strings are generated correctly by the expression 399451b44SJordan Rupprechtparser. 499451b44SJordan Rupprecht""" 599451b44SJordan Rupprecht 699451b44SJordan Rupprecht 799451b44SJordan Rupprechtimport shutil 899451b44SJordan Rupprechtimport subprocess 999451b44SJordan Rupprechtimport lldb 1099451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 1199451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 1299451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 1399451b44SJordan Rupprecht 1499451b44SJordan Rupprecht 1599451b44SJordan Rupprechtclass TestObjCBreakpoints(TestBase): 16a852cf66SMichał Górny @add_test_categories(["objc"]) 1799451b44SJordan Rupprecht def test_break(self): 1899451b44SJordan Rupprecht """Test setting Objective-C specific breakpoints (DWARF in .o files).""" 1999451b44SJordan Rupprecht self.build() 2099451b44SJordan Rupprecht self.setTearDownCleanup() 2199451b44SJordan Rupprecht self.check_objc_breakpoints(False) 2299451b44SJordan Rupprecht 2399451b44SJordan Rupprecht def setUp(self): 2499451b44SJordan Rupprecht # Call super's setUp(). 2599451b44SJordan Rupprecht TestBase.setUp(self) 2699451b44SJordan Rupprecht # Find the line number to break inside main(). 2799451b44SJordan Rupprecht self.main_source = "main.m" 282238dcc3SJonas Devlieghere self.line = line_number(self.main_source, "// Set breakpoint here") 2999451b44SJordan Rupprecht 3099451b44SJordan Rupprecht def check_category_breakpoints(self): 3199451b44SJordan Rupprecht name_bp = self.target.BreakpointCreateByName("myCategoryFunction") 3299451b44SJordan Rupprecht selector_bp = self.target.BreakpointCreateByName( 3399451b44SJordan Rupprecht "myCategoryFunction", 3499451b44SJordan Rupprecht lldb.eFunctionNameTypeSelector, 3599451b44SJordan Rupprecht lldb.SBFileSpecList(), 362238dcc3SJonas Devlieghere lldb.SBFileSpecList(), 372238dcc3SJonas Devlieghere ) 389fde5160SJonas Devlieghere self.assertEqual( 392238dcc3SJonas Devlieghere name_bp.GetNumLocations(), 402238dcc3SJonas Devlieghere selector_bp.GetNumLocations(), 412238dcc3SJonas Devlieghere 'Make sure setting a breakpoint by name "myCategoryFunction" sets a breakpoint even though it is in a category', 422238dcc3SJonas Devlieghere ) 4399451b44SJordan Rupprecht for bp_loc in selector_bp: 4499451b44SJordan Rupprecht function_name = bp_loc.GetAddress().GetSymbol().GetName() 45*9c246882SJordan Rupprecht self.assertIn( 46*9c246882SJordan Rupprecht " myCategoryFunction]", 47*9c246882SJordan Rupprecht function_name, 482238dcc3SJonas Devlieghere 'Make sure all function names have " myCategoryFunction]" in their names', 492238dcc3SJonas Devlieghere ) 5099451b44SJordan Rupprecht 5199451b44SJordan Rupprecht category_bp = self.target.BreakpointCreateByName( 522238dcc3SJonas Devlieghere "-[MyClass(MyCategory) myCategoryFunction]" 532238dcc3SJonas Devlieghere ) 5499451b44SJordan Rupprecht stripped_bp = self.target.BreakpointCreateByName( 552238dcc3SJonas Devlieghere "-[MyClass myCategoryFunction]" 562238dcc3SJonas Devlieghere ) 5799451b44SJordan Rupprecht stripped2_bp = self.target.BreakpointCreateByName( 582238dcc3SJonas Devlieghere "[MyClass myCategoryFunction]" 592238dcc3SJonas Devlieghere ) 609fde5160SJonas Devlieghere self.assertEqual( 612238dcc3SJonas Devlieghere category_bp.GetNumLocations(), 622238dcc3SJonas Devlieghere 1, 632238dcc3SJonas Devlieghere "Make sure we can set a breakpoint using a full objective C function name with the category included (-[MyClass(MyCategory) myCategoryFunction])", 642238dcc3SJonas Devlieghere ) 659fde5160SJonas Devlieghere self.assertEqual( 662238dcc3SJonas Devlieghere stripped_bp.GetNumLocations(), 672238dcc3SJonas Devlieghere 1, 682238dcc3SJonas Devlieghere "Make sure we can set a breakpoint using a full objective C function name without the category included (-[MyClass myCategoryFunction])", 692238dcc3SJonas Devlieghere ) 709fde5160SJonas Devlieghere self.assertEqual( 712238dcc3SJonas Devlieghere stripped2_bp.GetNumLocations(), 722238dcc3SJonas Devlieghere 1, 732238dcc3SJonas Devlieghere "Make sure we can set a breakpoint using a full objective C function name without the category included ([MyClass myCategoryFunction])", 742238dcc3SJonas Devlieghere ) 7599451b44SJordan Rupprecht 7699451b44SJordan Rupprecht def check_objc_breakpoints(self, have_dsym): 7799451b44SJordan Rupprecht """Test constant string generation amd comparison by the expression parser.""" 7899451b44SJordan Rupprecht 7999451b44SJordan Rupprecht # Set debugger into synchronous mode 8099451b44SJordan Rupprecht self.dbg.SetAsync(False) 8199451b44SJordan Rupprecht 8299451b44SJordan Rupprecht # Create a target by the debugger. 8399451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 8499451b44SJordan Rupprecht self.target = self.dbg.CreateTarget(exe) 8599451b44SJordan Rupprecht self.assertTrue(self.target, VALID_TARGET) 8699451b44SJordan Rupprecht 8799451b44SJordan Rupprecht # ---------------------------------------------------------------------- 8899451b44SJordan Rupprecht # Set breakpoints on all selectors whose name is "count". This should 8999451b44SJordan Rupprecht # catch breakpoints that are both C functions _and_ anything whose 9099451b44SJordan Rupprecht # selector is "count" because just looking at "count" we can't tell 9199451b44SJordan Rupprecht # definitively if the name is a selector or a C function 9299451b44SJordan Rupprecht # ---------------------------------------------------------------------- 9399451b44SJordan Rupprecht name_bp = self.target.BreakpointCreateByName("count") 9499451b44SJordan Rupprecht selector_bp = self.target.BreakpointCreateByName( 9599451b44SJordan Rupprecht "count", 9699451b44SJordan Rupprecht lldb.eFunctionNameTypeSelector, 9799451b44SJordan Rupprecht lldb.SBFileSpecList(), 982238dcc3SJonas Devlieghere lldb.SBFileSpecList(), 992238dcc3SJonas Devlieghere ) 1009fde5160SJonas Devlieghere self.assertGreaterEqual( 1012238dcc3SJonas Devlieghere name_bp.GetNumLocations(), 1022238dcc3SJonas Devlieghere selector_bp.GetNumLocations(), 1032238dcc3SJonas Devlieghere 'Make sure we get at least the same amount of breakpoints if not more when setting by name "count"', 1042238dcc3SJonas Devlieghere ) 1059fde5160SJonas Devlieghere self.assertGreater( 1062238dcc3SJonas Devlieghere selector_bp.GetNumLocations(), 1072238dcc3SJonas Devlieghere 50, 1082238dcc3SJonas Devlieghere 'Make sure we find a lot of "count" selectors', 1092238dcc3SJonas Devlieghere ) # There are 93 on the latest MacOSX 11099451b44SJordan Rupprecht for bp_loc in selector_bp: 11199451b44SJordan Rupprecht function_name = bp_loc.GetAddress().GetSymbol().GetName() 112*9c246882SJordan Rupprecht self.assertIn( 113*9c246882SJordan Rupprecht " count]", 114*9c246882SJordan Rupprecht function_name, 1152238dcc3SJonas Devlieghere 'Make sure all function names have " count]" in their names', 1162238dcc3SJonas Devlieghere ) 11799451b44SJordan Rupprecht 11899451b44SJordan Rupprecht # ---------------------------------------------------------------------- 11999451b44SJordan Rupprecht # Set breakpoints on all selectors whose name is "isEqual:". This should 12099451b44SJordan Rupprecht # catch breakpoints that are only ObjC selectors because no C function 12199451b44SJordan Rupprecht # can end with a : 12299451b44SJordan Rupprecht # ---------------------------------------------------------------------- 12399451b44SJordan Rupprecht name_bp = self.target.BreakpointCreateByName("isEqual:") 12499451b44SJordan Rupprecht selector_bp = self.target.BreakpointCreateByName( 12599451b44SJordan Rupprecht "isEqual:", 12699451b44SJordan Rupprecht lldb.eFunctionNameTypeSelector, 12799451b44SJordan Rupprecht lldb.SBFileSpecList(), 1282238dcc3SJonas Devlieghere lldb.SBFileSpecList(), 1292238dcc3SJonas Devlieghere ) 1309fde5160SJonas Devlieghere self.assertEqual( 1312238dcc3SJonas Devlieghere name_bp.GetNumLocations(), 1322238dcc3SJonas Devlieghere selector_bp.GetNumLocations(), 1332238dcc3SJonas Devlieghere 'Make sure setting a breakpoint by name "isEqual:" only sets selector breakpoints', 1342238dcc3SJonas Devlieghere ) 13599451b44SJordan Rupprecht for bp_loc in selector_bp: 13699451b44SJordan Rupprecht function_name = bp_loc.GetAddress().GetSymbol().GetName() 137*9c246882SJordan Rupprecht self.assertIn( 138*9c246882SJordan Rupprecht " isEqual:]", 139*9c246882SJordan Rupprecht function_name, 1402238dcc3SJonas Devlieghere 'Make sure all function names have " isEqual:]" in their names', 1412238dcc3SJonas Devlieghere ) 14299451b44SJordan Rupprecht 14399451b44SJordan Rupprecht self.check_category_breakpoints() 14499451b44SJordan Rupprecht 14599451b44SJordan Rupprecht if have_dsym: 14699451b44SJordan Rupprecht shutil.rmtree(exe + ".dSYM") 1472238dcc3SJonas Devlieghere self.assertEqual( 1482238dcc3SJonas Devlieghere subprocess.call(["/usr/bin/strip", "-Sx", exe]), 1492238dcc3SJonas Devlieghere 0, 1502238dcc3SJonas Devlieghere "stripping dylib succeeded", 1512238dcc3SJonas Devlieghere ) 15299451b44SJordan Rupprecht 15399451b44SJordan Rupprecht # Check breakpoints again, this time using the symbol table only 15499451b44SJordan Rupprecht self.check_category_breakpoints() 155