xref: /llvm-project/lldb/test/API/lang/objc/objc-ivar-stripped/TestObjCIvarStripped.py (revision 80fcecb13c388ff087a27a4b0e7ca3dd8c98eaa4)
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