""" Test symbol table access for main.m. """ import lldb from lldbsuite.test.decorators import * from lldbsuite.test.lldbtest import * from lldbsuite.test import lldbutil class FoundationSymtabTestCase(TestBase): mydir = TestBase.compute_mydir(__file__) symbols_list = ['-[MyString initWithNSString:]', '-[MyString dealloc]', '-[MyString description]', '-[MyString descriptionPauses]', # synthesized property '-[MyString setDescriptionPauses:]', # synthesized property 'Test_Selector', 'Test_NSString', 'Test_MyString', 'Test_NSArray', 'main' ] @add_test_categories(['pyapi']) def test_with_python_api(self): """Test symbol table access with Python APIs.""" self.build() exe = self.getBuildArtifact("a.out") target = self.dbg.CreateTarget(exe) self.assertTrue(target, VALID_TARGET) # Launch the process, and do not stop at the entry point. process = target.LaunchSimple( None, None, self.get_process_working_directory()) self.assertTrue(process, PROCESS_IS_VALID) # Create the filespec by which to locate our a.out module. # # - Use the absolute path to get the module for the current variant. # - Use the relative path for reproducers. The modules are never # orphaned because the SB objects are leaked intentionally. This # causes LLDB to reuse the same module for every variant, because the # UUID is the same for all the inferiors. FindModule below only # compares paths and is oblivious to the fact that the UUIDs are the # same. if configuration.is_reproducer(): filespec = lldb.SBFileSpec('a.out', False) else: filespec = lldb.SBFileSpec(exe, False) module = target.FindModule(filespec) self.assertTrue(module, VALID_MODULE) # Create the set of known symbols. As we iterate through the symbol # table, remove the symbol from the set if it is a known symbol. expected_symbols = set(self.symbols_list) for symbol in module: self.assertTrue(symbol, VALID_SYMBOL) self.trace("symbol:", symbol) name = symbol.GetName() if name in expected_symbols: self.trace("Removing %s from known_symbols %s" % (name, expected_symbols)) expected_symbols.remove(name) # At this point, the known_symbols set should have become an empty set. # If not, raise an error. self.trace("symbols unaccounted for:", expected_symbols) self.assertEqual(len(expected_symbols), 0, "All the known symbols are accounted for")