TestObjCDynamicValue.py [plain text]
"""
Use lldb Python API to test dynamic values in ObjC
"""
import os, time
import re
import unittest2
import lldb, lldbutil
from lldbtest import *
class ObjCDynamicValueTestCase(TestBase):
mydir = os.path.join("lang", "objc", "objc-dynamic-value")
@unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
@python_api_test
@dsym_test
def test_get_dynamic_objc_vals_with_dsym(self):
"""Test fetching ObjC dynamic values."""
if self.getArchitecture() == 'i386':
self.skipTest("Dynamic types for ObjC V1 runtime not implemented")
self.buildDsym()
self.do_get_dynamic_vals()
@python_api_test
@dwarf_test
def test_get_objc_dynamic_vals_with_dwarf(self):
"""Test fetching ObjC dynamic values."""
if self.getArchitecture() == 'i386':
self.skipTest("Dynamic types for ObjC V1 runtime not implemented")
self.buildDwarf()
self.do_get_dynamic_vals()
def setUp(self):
TestBase.setUp(self)
self.source_name = 'dynamic-value.m'
self.set_property_line = line_number(self.source_name, '// This is the line in setProperty, make sure we step to here.')
self.handle_SourceBase = line_number(self.source_name,
'// Break here to check dynamic values.')
self.main_before_setProperty_line = line_number(self.source_name,
'// Break here to see if we can step into real method.')
def examine_SourceDerived_ptr (self, object):
self.assertTrue (object)
self.assertTrue (object.GetTypeName().find ('SourceDerived') != -1)
derivedValue = object.GetChildMemberWithName ('_derivedValue')
self.assertTrue (derivedValue)
self.assertTrue (int (derivedValue.GetValue(), 0) == 30)
def do_get_dynamic_vals(self):
"""Make sure we get dynamic values correctly both for compiled in classes and dynamic ones"""
exe = os.path.join(os.getcwd(), "a.out")
target = self.dbg.CreateTarget (exe)
self.assertTrue(target, VALID_TARGET)
handle_SourceBase_bkpt = target.BreakpointCreateByLocation(self.source_name, self.handle_SourceBase)
self.assertTrue(handle_SourceBase_bkpt and
handle_SourceBase_bkpt.GetNumLocations() == 1,
VALID_BREAKPOINT)
main_before_setProperty_bkpt = target.BreakpointCreateByLocation(self.source_name, self.main_before_setProperty_line)
self.assertTrue(main_before_setProperty_bkpt and
main_before_setProperty_bkpt.GetNumLocations() == 1,
VALID_BREAKPOINT)
process = target.LaunchSimple (None, None, os.getcwd())
self.assertTrue(process.GetState() == lldb.eStateStopped,
PROCESS_STOPPED)
threads = lldbutil.get_threads_stopped_at_breakpoint (process, main_before_setProperty_bkpt)
self.assertTrue (len(threads) == 1)
thread = threads[0]
frame = thread.GetFrameAtIndex(0)
myObserver = frame.FindVariable('myObserver', lldb.eDynamicCanRunTarget)
self.assertTrue (myObserver)
myObserver_source = myObserver.GetChildMemberWithName ('_source', lldb.eDynamicCanRunTarget)
self.examine_SourceDerived_ptr (myObserver_source)
frame = thread.GetFrameAtIndex(0)
myObserver_static = frame.FindVariable('myObserver', lldb.eNoDynamicValues)
self.assertTrue (myObserver_static)
myObserver = myObserver_static.GetDynamicValue (lldb.eDynamicCanRunTarget)
myObserver_source = myObserver.GetChildMemberWithName ('_source', lldb.eDynamicCanRunTarget)
self.examine_SourceDerived_ptr (myObserver_source)
result = lldb.SBCommandReturnObject()
self.expect('frame var -d run-target myObserver->_source', 'frame var finds its way into a child member',
patterns = ['\(SourceDerived \*\)'])
self.expect('frame var -d run-target myObserver->_source -T', 'the KVO-ed class is hidden',
substrs = ['dynamic type: SourceDerived'])
self.expect('frame var -d run-target myObserver->_source -T', 'the KVO-ed class is hidden', matching = False,
substrs = ['dynamic type: NSKVONotify'])
thread.StepInto()
threads = lldbutil.get_stopped_threads (process, lldb.eStopReasonPlanComplete)
self.assertTrue (len(threads) == 1)
line_entry = threads[0].GetFrameAtIndex(0).GetLineEntry()
self.assertTrue (line_entry.GetLine() == self.set_property_line)
self.assertTrue (line_entry.GetFileSpec().GetFilename() == self.source_name)
threads = lldbutil.continue_to_breakpoint (process, handle_SourceBase_bkpt)
self.assertTrue (len(threads) == 1)
thread = threads[0]
frame = thread.GetFrameAtIndex(0)
noDynamic = lldb.eNoDynamicValues
useDynamic = lldb.eDynamicCanRunTarget
object_static = frame.FindVariable ('object', noDynamic)
object_dynamic = frame.FindVariable ('object', useDynamic)
del (object_static)
self.examine_SourceDerived_ptr (object_dynamic)
object_static = frame.FindValue ('object', lldb.eValueTypeVariableArgument, noDynamic)
object_dynamic = frame.FindValue ('object', lldb.eValueTypeVariableArgument, useDynamic)
del (object_static)
self.examine_SourceDerived_ptr (object_dynamic)
object_static = frame.EvaluateExpression ('object', noDynamic)
object_dynamic = frame.EvaluateExpression ('object', useDynamic)
del (object_static)
self.examine_SourceDerived_ptr (object_dynamic)
threads = lldbutil.continue_to_breakpoint (process, handle_SourceBase_bkpt)
self.assertTrue (len(threads) == 1)
thread = threads[0]
frame = thread.GetFrameAtIndex(0)
object_static = frame.FindVariable ('object', noDynamic)
object_dynamic = frame.FindVariable ('object', useDynamic)
del (object_static)
self.examine_SourceDerived_ptr (object_dynamic)
if __name__ == '__main__':
import atexit
lldb.SBDebugger.Initialize()
atexit.register(lambda: lldb.SBDebugger.Terminate())
unittest2.main()