| """ | |
| Test lookup unnamed symbols. | |
| """ | |
| import lldb | |
| from lldbsuite.test.decorators import * | |
| from lldbsuite.test.lldbtest import * | |
| from lldbsuite.test import lldbutil | |
| # --keep-symbol causes error on Windows: llvm-strip.exe: error: option is not supported for COFF | |
| @skipIfWindows | |
| # llvm-strip doesn't support --keep-symbol for the Wasm object format. | |
| @skipIfWasm | |
| # Unnamed symbols don't get into the .eh_frame section on ARM, so LLDB can't find them. | |
| @skipIf(archs=["arm$"]) | |
| class TestUnnamedSymbolLookup(TestBase): | |
| @expectedFailureAll(archs=["arm64e"]) | |
| def test_unnamed_symbol_lookup(self): | |
| """Test looking up unnamed symbol synthetic name""" | |
| self.build() | |
| (target, process, thread, bkpt) = lldbutil.run_to_name_breakpoint( | |
| self, "main", exe_name="a.out.stripped" | |
| ) | |
| main_frame = thread.GetFrameAtIndex(0) | |
| # Step until reaching the unnamed symbol called from main | |
| for _ in range(100): | |
| thread.StepInto() | |
| if thread.GetFrameAtIndex(0) != main_frame: | |
| break | |
| thread.StepInto() | |
| self.assertEqual( | |
| main_frame, thread.GetFrameAtIndex(1), "Expected to be called from main" | |
| ) | |
| symbol = thread.GetFrameAtIndex(0).GetSymbol() | |
| self.assertIsNotNone(symbol, "unnamed symbol called from main not reached") | |
| self.assertTrue(symbol.name.startswith("___lldb_unnamed_symbol")) | |
| exe_module = symbol.GetStartAddress().GetModule() | |
| found_symbols = exe_module.FindSymbols(symbol.name) | |
| self.assertIsNotNone(found_symbols) | |
| self.assertEqual(found_symbols.GetSize(), 1) |