| import lldb | |
| from lldbsuite.test.decorators import * | |
| from lldbsuite.test.lldbtest import * | |
| from lldbsuite.test import lldbutil | |
| class SharedCacheHostMemoryTestCase(TestBase): | |
| NO_DEBUG_INFO_TESTCASE = True | |
| @requireDarwin | |
| @skipIfRemote | |
| def test_host_lldb_memory(self): | |
| """Stop in a shared cache binary loaded from lldb's own memory and | |
| backtrace through it.""" | |
| self.build() | |
| self.runCmd("settings set symbols.shared-cache-binary-loading host-lldb-memory") | |
| self.addTearDownHook( | |
| lambda: self.runCmd("settings clear symbols.shared-cache-binary-loading") | |
| ) | |
| target = self.createTestTarget() | |
| # Breaking on puts forces lldb to load and symbolicate the shared cache | |
| # binary it lives in. The breakpoint resolves once that library is | |
| # loaded as the process launches. | |
| breakpoint = target.BreakpointCreateByName("puts") | |
| process = target.LaunchSimple(None, None, self.get_process_working_directory()) | |
| self.assertState(process.GetState(), lldb.eStateStopped, PROCESS_STOPPED) | |
| self.assertGreater( | |
| breakpoint.GetNumLocations(), | |
| 0, | |
| "puts breakpoint should resolve in the shared cache binary", | |
| ) | |
| thread = lldbutil.get_stopped_thread(process, lldb.eStopReasonBreakpoint) | |
| self.assertIsNotNone(thread, "Expected to stop at the puts breakpoint") | |
| # We should be able to walk the stack out of the shared cache binary | |
| # and back to main without crashing. | |
| self.assertEqual(thread.GetFrameAtIndex(0).GetFunctionName(), "puts") | |
| self.assertGreater(thread.GetNumFrames(), 1) | |
| frame_names = [ | |
| thread.GetFrameAtIndex(i).GetFunctionName() | |
| for i in range(thread.GetNumFrames()) | |
| ] | |
| self.assertIn("main", frame_names) |