Home | History | Annotate | Download | only in objc-ivar-offsets
      1 """Test printing ObjC objects that use unbacked properties - so that the static ivar offsets are incorrect."""
      2 
      3 import os, time
      4 import unittest2
      5 import lldb
      6 from lldbtest import *
      7 import lldbutil
      8 
      9 class TestObjCIvarOffsets(TestBase):
     10 
     11     mydir = os.path.join("lang", "objc", "objc-ivar-offsets")
     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 printing ObjC objects that use unbacked properties"""
     18         self.buildDsym()
     19         self.objc_ivar_offsets()
     20 
     21     @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
     22     @python_api_test
     23     @dwarf_test
     24     def test_with_dwarf_and_python_api(self):
     25         """Test printing ObjC objects that use unbacked properties"""
     26         self.buildDwarf()
     27         self.objc_ivar_offsets()
     28 
     29     def setUp(self):
     30         # Call super's setUp().
     31         TestBase.setUp(self)
     32         # Find the line numbers to break inside main().
     33         self.main_source = "main.m"
     34         self.stop_line = line_number(self.main_source, '// Set breakpoint here.')
     35 
     36     def objc_ivar_offsets(self):
     37         """Use Python APIs to test stepping into ObjC methods."""
     38         exe = os.path.join(os.getcwd(), "a.out")
     39 
     40         target = self.dbg.CreateTarget(exe)
     41         self.assertTrue(target, VALID_TARGET)
     42 
     43         breakpoint = target.BreakpointCreateByLocation(self.main_source, self.stop_line)
     44         self.assertTrue(breakpoint, VALID_BREAKPOINT)
     45 
     46         process = target.LaunchSimple (None, None, os.getcwd())
     47         self.assertTrue (process, "Created a process.")
     48         self.assertTrue (process.GetState() == lldb.eStateStopped, "Stopped it too.")
     49 
     50         thread_list = lldbutil.get_threads_stopped_at_breakpoint (process, breakpoint)
     51         self.assertTrue (len(thread_list) == 1)
     52         thread = thread_list[0]
     53         
     54         frame = thread.GetFrameAtIndex(0)
     55         self.assertTrue (frame, "frame 0 is valid")
     56         
     57         mine = thread.GetFrameAtIndex(0).FindVariable("mine")
     58         self.assertTrue(mine, "Found local variable mine.")
     59         
     60         # Test the value object value for BaseClass->_backed_int
     61 
     62         error = lldb.SBError()
     63 
     64         mine_backed_int = mine.GetChildMemberWithName ("_backed_int")
     65         self.assertTrue(mine_backed_int, "Found mine->backed_int local variable.")
     66         backed_value = mine_backed_int.GetValueAsSigned (error)
     67         self.assertTrue (error.Success())
     68         self.assertTrue (backed_value == 1111)
     69         
     70         # Test the value object value for DerivedClass->_derived_backed_int
     71 
     72         mine_derived_backed_int = mine.GetChildMemberWithName ("_derived_backed_int")
     73         self.assertTrue(mine_derived_backed_int, "Found mine->derived_backed_int local variable.")
     74         derived_backed_value = mine_derived_backed_int.GetValueAsSigned (error)
     75         self.assertTrue (error.Success())
     76         self.assertTrue (derived_backed_value == 3333)
     77 
     78         # Make sure we also get bit-field offsets correct:
     79 
     80         mine_flag2 = mine.GetChildMemberWithName ("flag2")
     81         self.assertTrue(mine_flag2, "Found mine->flag2 local variable.")
     82         flag2_value = mine_flag2.GetValueAsUnsigned (error)
     83         self.assertTrue (error.Success())
     84         self.assertTrue (flag2_value == 7)
     85         
     86 if __name__ == '__main__':
     87     import atexit
     88     lldb.SBDebugger.Initialize()
     89     atexit.register(lambda: lldb.SBDebugger.Terminate())
     90     unittest2.main()
     91