199451b44SJordan Rupprecht""" 299451b44SJordan RupprechtTest that objective-c constant strings are generated correctly by the expression 399451b44SJordan Rupprechtparser. 499451b44SJordan Rupprecht""" 599451b44SJordan Rupprecht 699451b44SJordan Rupprecht 799451b44SJordan Rupprecht 899451b44SJordan Rupprechtimport shutil 999451b44SJordan Rupprechtimport subprocess 1099451b44SJordan Rupprechtimport lldb 1199451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 1299451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 1399451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 1499451b44SJordan Rupprecht 1599451b44SJordan Rupprecht 1699451b44SJordan Rupprechtclass TestObjCBreakpoints(TestBase): 1799451b44SJordan Rupprecht 18*a852cf66SMichał Górny @add_test_categories(["objc"]) 1999451b44SJordan Rupprecht def test_break(self): 2099451b44SJordan Rupprecht """Test setting Objective-C specific breakpoints (DWARF in .o files).""" 2199451b44SJordan Rupprecht self.build() 2299451b44SJordan Rupprecht self.setTearDownCleanup() 2399451b44SJordan Rupprecht self.check_objc_breakpoints(False) 2499451b44SJordan Rupprecht 2599451b44SJordan Rupprecht def setUp(self): 2699451b44SJordan Rupprecht # Call super's setUp(). 2799451b44SJordan Rupprecht TestBase.setUp(self) 2899451b44SJordan Rupprecht # Find the line number to break inside main(). 2999451b44SJordan Rupprecht self.main_source = "main.m" 3099451b44SJordan Rupprecht self.line = line_number(self.main_source, '// Set breakpoint here') 3199451b44SJordan Rupprecht 3299451b44SJordan Rupprecht def check_category_breakpoints(self): 3399451b44SJordan Rupprecht name_bp = self.target.BreakpointCreateByName("myCategoryFunction") 3499451b44SJordan Rupprecht selector_bp = self.target.BreakpointCreateByName( 3599451b44SJordan Rupprecht "myCategoryFunction", 3699451b44SJordan Rupprecht lldb.eFunctionNameTypeSelector, 3799451b44SJordan Rupprecht lldb.SBFileSpecList(), 3899451b44SJordan Rupprecht lldb.SBFileSpecList()) 399fde5160SJonas Devlieghere self.assertEqual( 409fde5160SJonas Devlieghere name_bp.GetNumLocations(), selector_bp.GetNumLocations(), 4199451b44SJordan Rupprecht 'Make sure setting a breakpoint by name "myCategoryFunction" sets a breakpoint even though it is in a category') 4299451b44SJordan Rupprecht for bp_loc in selector_bp: 4399451b44SJordan Rupprecht function_name = bp_loc.GetAddress().GetSymbol().GetName() 4499451b44SJordan Rupprecht self.assertTrue( 4599451b44SJordan Rupprecht " myCategoryFunction]" in function_name, 4699451b44SJordan Rupprecht 'Make sure all function names have " myCategoryFunction]" in their names') 4799451b44SJordan Rupprecht 4899451b44SJordan Rupprecht category_bp = self.target.BreakpointCreateByName( 4999451b44SJordan Rupprecht "-[MyClass(MyCategory) myCategoryFunction]") 5099451b44SJordan Rupprecht stripped_bp = self.target.BreakpointCreateByName( 5199451b44SJordan Rupprecht "-[MyClass myCategoryFunction]") 5299451b44SJordan Rupprecht stripped2_bp = self.target.BreakpointCreateByName( 5399451b44SJordan Rupprecht "[MyClass myCategoryFunction]") 549fde5160SJonas Devlieghere self.assertEqual( 559fde5160SJonas Devlieghere category_bp.GetNumLocations(), 1, 5699451b44SJordan Rupprecht "Make sure we can set a breakpoint using a full objective C function name with the category included (-[MyClass(MyCategory) myCategoryFunction])") 579fde5160SJonas Devlieghere self.assertEqual( 589fde5160SJonas Devlieghere stripped_bp.GetNumLocations(), 1, 5999451b44SJordan Rupprecht "Make sure we can set a breakpoint using a full objective C function name without the category included (-[MyClass myCategoryFunction])") 609fde5160SJonas Devlieghere self.assertEqual( 619fde5160SJonas Devlieghere stripped2_bp.GetNumLocations(), 1, 6299451b44SJordan Rupprecht "Make sure we can set a breakpoint using a full objective C function name without the category included ([MyClass myCategoryFunction])") 6399451b44SJordan Rupprecht 6499451b44SJordan Rupprecht def check_objc_breakpoints(self, have_dsym): 6599451b44SJordan Rupprecht """Test constant string generation amd comparison by the expression parser.""" 6699451b44SJordan Rupprecht 6799451b44SJordan Rupprecht # Set debugger into synchronous mode 6899451b44SJordan Rupprecht self.dbg.SetAsync(False) 6999451b44SJordan Rupprecht 7099451b44SJordan Rupprecht # Create a target by the debugger. 7199451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 7299451b44SJordan Rupprecht self.target = self.dbg.CreateTarget(exe) 7399451b44SJordan Rupprecht self.assertTrue(self.target, VALID_TARGET) 7499451b44SJordan Rupprecht 7599451b44SJordan Rupprecht #---------------------------------------------------------------------- 7699451b44SJordan Rupprecht # Set breakpoints on all selectors whose name is "count". This should 7799451b44SJordan Rupprecht # catch breakpoints that are both C functions _and_ anything whose 7899451b44SJordan Rupprecht # selector is "count" because just looking at "count" we can't tell 7999451b44SJordan Rupprecht # definitively if the name is a selector or a C function 8099451b44SJordan Rupprecht #---------------------------------------------------------------------- 8199451b44SJordan Rupprecht name_bp = self.target.BreakpointCreateByName("count") 8299451b44SJordan Rupprecht selector_bp = self.target.BreakpointCreateByName( 8399451b44SJordan Rupprecht "count", 8499451b44SJordan Rupprecht lldb.eFunctionNameTypeSelector, 8599451b44SJordan Rupprecht lldb.SBFileSpecList(), 8699451b44SJordan Rupprecht lldb.SBFileSpecList()) 879fde5160SJonas Devlieghere self.assertGreaterEqual( 889fde5160SJonas Devlieghere name_bp.GetNumLocations(), selector_bp.GetNumLocations(), 8999451b44SJordan Rupprecht 'Make sure we get at least the same amount of breakpoints if not more when setting by name "count"') 909fde5160SJonas Devlieghere self.assertGreater( 919fde5160SJonas Devlieghere selector_bp.GetNumLocations(), 50, 9299451b44SJordan Rupprecht 'Make sure we find a lot of "count" selectors') # There are 93 on the latest MacOSX 9399451b44SJordan Rupprecht for bp_loc in selector_bp: 9499451b44SJordan Rupprecht function_name = bp_loc.GetAddress().GetSymbol().GetName() 9599451b44SJordan Rupprecht self.assertTrue( 9699451b44SJordan Rupprecht " count]" in function_name, 9799451b44SJordan Rupprecht 'Make sure all function names have " count]" in their names') 9899451b44SJordan Rupprecht 9999451b44SJordan Rupprecht #---------------------------------------------------------------------- 10099451b44SJordan Rupprecht # Set breakpoints on all selectors whose name is "isEqual:". This should 10199451b44SJordan Rupprecht # catch breakpoints that are only ObjC selectors because no C function 10299451b44SJordan Rupprecht # can end with a : 10399451b44SJordan Rupprecht #---------------------------------------------------------------------- 10499451b44SJordan Rupprecht name_bp = self.target.BreakpointCreateByName("isEqual:") 10599451b44SJordan Rupprecht selector_bp = self.target.BreakpointCreateByName( 10699451b44SJordan Rupprecht "isEqual:", 10799451b44SJordan Rupprecht lldb.eFunctionNameTypeSelector, 10899451b44SJordan Rupprecht lldb.SBFileSpecList(), 10999451b44SJordan Rupprecht lldb.SBFileSpecList()) 1109fde5160SJonas Devlieghere self.assertEqual( 1119fde5160SJonas Devlieghere name_bp.GetNumLocations(), selector_bp.GetNumLocations(), 11299451b44SJordan Rupprecht 'Make sure setting a breakpoint by name "isEqual:" only sets selector breakpoints') 11399451b44SJordan Rupprecht for bp_loc in selector_bp: 11499451b44SJordan Rupprecht function_name = bp_loc.GetAddress().GetSymbol().GetName() 11599451b44SJordan Rupprecht self.assertTrue( 11699451b44SJordan Rupprecht " isEqual:]" in function_name, 11799451b44SJordan Rupprecht 'Make sure all function names have " isEqual:]" in their names') 11899451b44SJordan Rupprecht 11999451b44SJordan Rupprecht self.check_category_breakpoints() 12099451b44SJordan Rupprecht 12199451b44SJordan Rupprecht if have_dsym: 12299451b44SJordan Rupprecht shutil.rmtree(exe + ".dSYM") 1239fde5160SJonas Devlieghere self.assertEqual(subprocess.call( 1249fde5160SJonas Devlieghere ['/usr/bin/strip', '-Sx', exe]), 0, 'stripping dylib succeeded') 12599451b44SJordan Rupprecht 12699451b44SJordan Rupprecht # Check breakpoints again, this time using the symbol table only 12799451b44SJordan Rupprecht self.check_category_breakpoints() 128