1"""Test printing ObjC objects that use unbacked properties - so that the static ivar offsets are incorrect.""" 2 3 4import lldb 5from lldbsuite.test.decorators import * 6from lldbsuite.test.lldbtest import * 7from lldbsuite.test import lldbutil 8 9 10class TestObjCIvarStripped(TestBase): 11 def setUp(self): 12 # Call super's setUp(). 13 TestBase.setUp(self) 14 # Find the line numbers to break inside main(). 15 self.main_source = "main.m" 16 self.stop_line = line_number(self.main_source, "// Set breakpoint here.") 17 18 @skipIf( 19 debug_info=no_match("dsym"), 20 bugnumber="This test requires a stripped binary and a dSYM", 21 ) 22 @add_test_categories(["pyapi"]) 23 def test_with_python_api(self): 24 """Test that we can find stripped Objective-C ivars in the runtime""" 25 self.build() 26 exe = self.getBuildArtifact("a.out.stripped") 27 28 target = self.dbg.CreateTarget(exe) 29 self.assertTrue(target, VALID_TARGET) 30 31 self.dbg.HandleCommand("add-dsym " + self.getBuildArtifact("a.out.dSYM")) 32 33 breakpoint = target.BreakpointCreateByLocation(self.main_source, self.stop_line) 34 self.assertTrue( 35 breakpoint.IsValid() and breakpoint.GetNumLocations() > 0, VALID_BREAKPOINT 36 ) 37 38 process = target.LaunchSimple(None, None, self.get_process_working_directory()) 39 self.assertTrue(process, "Created a process.") 40 self.assertEqual(process.GetState(), lldb.eStateStopped, "Stopped it too.") 41 42 thread_list = lldbutil.get_threads_stopped_at_breakpoint(process, breakpoint) 43 self.assertEqual(len(thread_list), 1) 44 thread = thread_list[0] 45 46 frame = thread.GetFrameAtIndex(0) 47 self.assertTrue(frame, "frame 0 is valid") 48 49 # Test the expression for mc->_foo 50 51 error = lldb.SBError() 52 53 ivar = frame.EvaluateExpression("(mc->_foo)") 54 self.assertTrue(ivar, "Got result for mc->_foo") 55 ivar_value = ivar.GetValueAsSigned(error) 56 self.assertSuccess(error) 57 self.assertEqual(ivar_value, 3) 58