• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1"""Test printing ObjC objects that use unbacked properties - so that the static ivar offsets are incorrect."""
2
3import os, time
4import unittest2
5import lldb
6from lldbtest import *
7import lldbutil
8
9class TestObjCIvarStripped(TestBase):
10
11    mydir = os.path.join("lang", "objc", "objc-ivar-stripped")
12
13    @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
14    @python_api_test
15    @dsym_test
16    def test_with_dsym_and_python_api(self):
17        """Test that we can find stripped Objective-C ivars in the runtime"""
18        self.buildDsym()
19        self.objc_ivar_offsets()
20
21    def setUp(self):
22        # Call super's setUp().
23        TestBase.setUp(self)
24        # Find the line numbers to break inside main().
25        self.main_source = "main.m"
26        self.stop_line = line_number(self.main_source, '// Set breakpoint here.')
27
28    def objc_ivar_offsets(self):
29        """Test that we can find stripped Objective-C ivars in the runtime"""
30        exe = os.path.join(os.getcwd(), "a.out.stripped")
31
32        target = self.dbg.CreateTarget(exe)
33        self.assertTrue(target, VALID_TARGET)
34
35        breakpoint = target.BreakpointCreateByLocation(self.main_source, self.stop_line)
36        self.assertTrue(breakpoint, VALID_BREAKPOINT)
37
38        process = target.LaunchSimple (None, None, os.getcwd())
39        self.assertTrue (process, "Created a process.")
40        self.assertTrue (process.GetState() == lldb.eStateStopped, "Stopped it too.")
41
42        thread_list = lldbutil.get_threads_stopped_at_breakpoint (process, breakpoint)
43        self.assertTrue (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.assertTrue (error.Success())
57        self.assertTrue (ivar_value == 3)
58
59if __name__ == '__main__':
60    import atexit
61    lldb.SBDebugger.Initialize()
62    atexit.register(lambda: lldb.SBDebugger.Terminate())
63    unittest2.main()
64