in commands/FBDebugCommands.py [0:0]
def run(self, arguments, options):
commandForObject, ivarName = arguments
objectAddress = int(fb.evaluateObjectExpression(commandForObject), 0)
ivarOffsetCommand = '(ptrdiff_t)ivar_getOffset((void*)object_getInstanceVariable((id){}, "{}", 0))'.format(
objectAddress, ivarName
)
ivarOffset = int(fb.evaluateExpression(ivarOffsetCommand), 0)
# A multi-statement command allows for variables scoped to the command,
# not permanent in the session like $variables.
ivarSizeCommand = (
"unsigned int size = 0;"
'char *typeEncoding = (char *)ivar_getTypeEncoding((void*)class_getInstanceVariable((Class)object_getClass((id){}), "{}"));'
"(char *)NSGetSizeAndAlignment(typeEncoding, &size, 0);"
"size"
).format(objectAddress, ivarName)
ivarSize = int(fb.evaluateExpression(ivarSizeCommand), 0)
error = lldb.SBError()
watchpoint = lldb.debugger.GetSelectedTarget().WatchAddress(
objectAddress + ivarOffset, ivarSize, False, True, error
)
if error.Success():
print(
"Remember to delete the watchpoint using: watchpoint delete {}".format(
watchpoint.GetID()
)
)
else:
print("Could not create the watchpoint: {}".format(error.GetCString()))