| import lldb | |
| from lldbsuite.test.decorators import * | |
| from lldbsuite.test.lldbtest import * | |
| from lldbsuite.test import lldbutil | |
| class ExprFromNonZeroFrame(TestBase): | |
| NO_DEBUG_INFO_TESTCASE = True | |
| # Requires DWARF debug information. | |
| @skipIfWindows | |
| def test(self): | |
| """ | |
| Tests that we can use SBFrame::EvaluateExpression on a frame | |
| that we're not stopped in, even if thread-plans run as part of | |
| parsing the expression (e.g., when running static initializers). | |
| """ | |
| self.build() | |
| (_, _, thread, _) = lldbutil.run_to_source_breakpoint( | |
| self, "return 5", lldb.SBFileSpec("main.c") | |
| ) | |
| frame = thread.GetFrameAtIndex(1) | |
| # Using a function pointer inside the expression ensures we | |
| # emit a ptrauth static initializer on arm64e into the JITted | |
| # expression. The thread-plan that runs for this static | |
| # initializer should save/restore the current execution context | |
| # frame (which in this test is frame #1). | |
| result = frame.EvaluateExpression("int (*fptr)() = &func; fptr()") | |
| self.assertTrue(result.GetError().Success()) | |
| self.assertEqual(result.GetValueAsSigned(), 5) |