+@lldb_command("showtaskuserdyldinfo")
+def ShowTaskUserDyldInfo(cmd_args=None):
+ """ Inspect the dyld global info for the given user task & print out all fields including error messages
+ Syntax: (lldb)showtaskuserdyldinfo <task_t>
+ """
+ if cmd_args == None or len(cmd_args) < 1:
+ print "No arguments passed"
+ print ShowTaskUserDyldInfo.__doc__.strip()
+ return
+
+ out_str = ""
+ task = kern.GetValueFromAddress(cmd_args[0], 'task_t')
+ is_task_64 = int(task.t_flags) & 0x1
+ dyld_all_image_infos_address = unsigned(task.all_image_info_addr)
+ if dyld_all_image_infos_address == 0:
+ print "No dyld shared library information available for task"
+ return False
+ vers_info_data = GetUserDataAsString(task, dyld_all_image_infos_address, 112)
+ dyld_all_image_infos_version = _ExtractDataFromString(vers_info_data, 0, "uint32_t")
+ if dyld_all_image_infos_version > 14:
+ out_str += "Unknown dyld all_image_infos version number %d" % dyld_all_image_infos_version
+
+ # Find fields by byte offset. We assume at least version 9 is supported
+ if is_task_64:
+ dyld_all_image_infos_infoArrayCount = _ExtractDataFromString(vers_info_data, 4, "uint32_t")
+ dyld_all_image_infos_infoArray = _ExtractDataFromString(vers_info_data, 8, "uint64_t")
+ dyld_all_image_infos_notification = _ExtractDataFromString(vers_info_data, 16, "uint64_t")
+ dyld_all_image_infos_processDetachedFromSharedRegion = _ExtractDataFromString(vers_info_data, 24, "string")
+ dyld_all_image_infos_libSystemInitialized = _ExtractDataFromString(vers_info_data, 25, "string")
+ dyld_all_image_infos_dyldImageLoadAddress = _ExtractDataFromString(vers_info_data, 32, "uint64_t")
+ dyld_all_image_infos_jitInfo = _ExtractDataFromString(vers_info_data, 40, "uint64_t")
+ dyld_all_image_infos_dyldVersion = _ExtractDataFromString(vers_info_data, 48, "uint64_t")
+ dyld_all_image_infos_errorMessage = _ExtractDataFromString(vers_info_data, 56, "uint64_t")
+ dyld_all_image_infos_terminationFlags = _ExtractDataFromString(vers_info_data, 64, "uint64_t")
+ dyld_all_image_infos_coreSymbolicationShmPage = _ExtractDataFromString(vers_info_data, 72, "uint64_t")
+ dyld_all_image_infos_systemOrderFlag = _ExtractDataFromString(vers_info_data, 80, "uint64_t")
+ dyld_all_image_infos_uuidArrayCount = _ExtractDataFromString(vers_info_data, 88, "uint64_t")
+ dyld_all_image_infos_uuidArray = _ExtractDataFromString(vers_info_data, 96, "uint64_t")
+ dyld_all_image_infos_dyldAllImageInfosAddress = _ExtractDataFromString(vers_info_data, 104, "uint64_t")
+ else:
+ dyld_all_image_infos_infoArrayCount = _ExtractDataFromString(vers_info_data, 4, "uint32_t")
+ dyld_all_image_infos_infoArray = _ExtractDataFromString(vers_info_data, 8, "uint32_t")
+ dyld_all_image_infos_notification = _ExtractDataFromString(vers_info_data, 12, "uint32_t")
+ dyld_all_image_infos_processDetachedFromSharedRegion = _ExtractDataFromString(vers_info_data, 16, "string")
+ dyld_all_image_infos_libSystemInitialized = _ExtractDataFromString(vers_info_data, 17, "string")
+ dyld_all_image_infos_dyldImageLoadAddress = _ExtractDataFromString(vers_info_data, 20, "uint32_t")
+ dyld_all_image_infos_jitInfo = _ExtractDataFromString(vers_info_data, 24, "uint32_t")
+ dyld_all_image_infos_dyldVersion = _ExtractDataFromString(vers_info_data, 28, "uint32_t")
+ dyld_all_image_infos_errorMessage = _ExtractDataFromString(vers_info_data, 32, "uint32_t")
+ dyld_all_image_infos_terminationFlags = _ExtractDataFromString(vers_info_data, 36, "uint32_t")
+ dyld_all_image_infos_coreSymbolicationShmPage = _ExtractDataFromString(vers_info_data, 40, "uint32_t")
+ dyld_all_image_infos_systemOrderFlag = _ExtractDataFromString(vers_info_data, 44, "uint32_t")
+ dyld_all_image_infos_uuidArrayCount = _ExtractDataFromString(vers_info_data, 48, "uint32_t")
+ dyld_all_image_infos_uuidArray = _ExtractDataFromString(vers_info_data, 52, "uint32_t")
+ dyld_all_image_infos_dyldAllImageInfosAddress = _ExtractDataFromString(vers_info_data, 56, "uint32_t")
+
+ dyld_all_imfo_infos_slide = (dyld_all_image_infos_address - dyld_all_image_infos_dyldAllImageInfosAddress)
+ dyld_all_image_infos_dyldVersion_postslide = (dyld_all_image_infos_dyldVersion + dyld_all_imfo_infos_slide)
+
+ path_out = GetPathForImage(task, dyld_all_image_infos_dyldVersion_postslide)
+ out_str += "[dyld-{:s}]\n".format(path_out)
+ out_str += "version \t\t\t\t: {:d}\n".format(dyld_all_image_infos_version)
+ out_str += "infoArrayCount \t\t\t\t: {:d}\n".format(dyld_all_image_infos_infoArrayCount)
+ out_str += "infoArray \t\t\t\t: {:#x}\n".format(dyld_all_image_infos_infoArray)
+ out_str += "notification \t\t\t\t: {:#x}\n".format(dyld_all_image_infos_notification)
+
+ out_str += "processDetachedFromSharedRegion \t: "
+ if dyld_all_image_infos_processDetachedFromSharedRegion != "":
+ out_str += "TRUE\n".format(dyld_all_image_infos_processDetachedFromSharedRegion)
+ else:
+ out_str += "FALSE\n"
+
+ out_str += "libSystemInitialized \t\t\t: "
+ if dyld_all_image_infos_libSystemInitialized != "":
+ out_str += "TRUE\n".format(dyld_all_image_infos_libSystemInitialized)
+ else:
+ out_str += "FALSE\n"
+
+ out_str += "dyldImageLoadAddress \t\t\t: {:#x}\n".format(dyld_all_image_infos_dyldImageLoadAddress)
+ out_str += "jitInfo \t\t\t\t: {:#x}\n".format(dyld_all_image_infos_jitInfo)
+ out_str += "\ndyldVersion \t\t\t\t: {:#x}".format(dyld_all_image_infos_dyldVersion)
+ if (dyld_all_imfo_infos_slide != 0):
+ out_str += " (currently {:#x})\n".format(dyld_all_image_infos_dyldVersion_postslide)
+ else:
+ out_str += "\n"
+
+ out_str += "errorMessage \t\t\t\t: {:#x}\n".format(dyld_all_image_infos_errorMessage)
+ if dyld_all_image_infos_errorMessage != 0:
+ out_str += GetPathForImage(task, dyld_all_image_infos_errorMessage)
+
+ out_str += "terminationFlags \t\t\t: {:#x}\n".format(dyld_all_image_infos_terminationFlags)
+ out_str += "coreSymbolicationShmPage \t\t: {:#x}\n".format(dyld_all_image_infos_coreSymbolicationShmPage)
+ out_str += "systemOrderFlag \t\t\t: {:#x}\n".format(dyld_all_image_infos_systemOrderFlag)
+ out_str += "uuidArrayCount \t\t\t\t: {:#x}\n".format(dyld_all_image_infos_uuidArrayCount)
+ out_str += "uuidArray \t\t\t\t: {:#x}\n".format(dyld_all_image_infos_uuidArray)
+ out_str += "dyldAllImageInfosAddress \t\t: {:#x}".format(dyld_all_image_infos_dyldAllImageInfosAddress)
+ if (dyld_all_imfo_infos_slide != 0):
+ out_str += " (currently {:#x})\n".format(dyld_all_image_infos_address)
+ else:
+ out_str += "\n"
+
+ if is_task_64:
+ dyld_all_image_infos_address = dyld_all_image_infos_address + 112
+ dyld_all_image_infos_v10 = GetUserDataAsString(task, dyld_all_image_infos_address, 64)
+ dyld_all_image_infos_initialImageCount = _ExtractDataFromString(dyld_all_image_infos_v10, 112-112, "uint64_t")
+ dyld_all_image_infos_errorKind = _ExtractDataFromString(dyld_all_image_infos_v10, 120-112, "uint64_t")
+ dyld_all_image_infos_errorClientOfDylibPath = _ExtractDataFromString(dyld_all_image_infos_v10, 128-112, "uint64_t")
+ dyld_all_image_infos_errorTargetDylibPath = _ExtractDataFromString(dyld_all_image_infos_v10, 136-112, "uint64_t")
+ dyld_all_image_infos_errorSymbol = _ExtractDataFromString(dyld_all_image_infos_v10, 144-112, "uint64_t")
+ dyld_all_image_infos_sharedCacheSlide = _ExtractDataFromString(dyld_all_image_infos_v10, 152-112, "uint64_t")
+ dyld_all_image_infos_sharedCacheUUID = _ExtractDataFromString(dyld_all_image_infos_v10, 160-112, "string")
+ else:
+ dyld_all_image_infos_address = dyld_all_image_infos_address + 60
+ dyld_all_image_infos_v10 = GetUserDataAsString(task, dyld_all_image_infos_address, 40)
+ dyld_all_image_infos_initialImageCount = _ExtractDataFromString(dyld_all_image_infos_v10, 60-60, "uint32_t")
+ dyld_all_image_infos_errorKind = _ExtractDataFromString(dyld_all_image_infos_v10, 64-60, "uint32_t")
+ dyld_all_image_infos_errorClientOfDylibPath = _ExtractDataFromString(dyld_all_image_infos_v10, 68-60, "uint32_t")
+ dyld_all_image_infos_errorTargetDylibPath = _ExtractDataFromString(dyld_all_image_infos_v10, 72-60, "uint32_t")
+ dyld_all_image_infos_errorSymbol = _ExtractDataFromString(dyld_all_image_infos_v10, 76-60, "uint32_t")
+ dyld_all_image_infos_sharedCacheSlide = _ExtractDataFromString(dyld_all_image_infos_v10, 80-60, "uint32_t")
+ dyld_all_image_infos_sharedCacheUUID = _ExtractDataFromString(dyld_all_image_infos_v10, 84-60, "string")
+
+ if dyld_all_image_infos_version >= 10:
+ out_str += "\ninitialImageCount \t\t\t: {:#x}\n".format(dyld_all_image_infos_initialImageCount)
+
+ if dyld_all_image_infos_version >= 11:
+ out_str += "errorKind \t\t\t\t: {:#x}\n".format(dyld_all_image_infos_errorKind)
+ out_str += "errorClientOfDylibPath \t\t\t: {:#x}\n".format(dyld_all_image_infos_errorClientOfDylibPath)
+ if dyld_all_image_infos_errorClientOfDylibPath != 0:
+ out_str += "\t\t\t\t"
+ out_str += GetPathForImage(task, dyld_all_image_infos_errorClientOfDylibPath)
+ out_str += "\n"
+ out_str += "errorTargetDylibPath \t\t\t: {:#x}\n".format(dyld_all_image_infos_errorTargetDylibPath)
+ if dyld_all_image_infos_errorTargetDylibPath != 0:
+ out_str += "\t\t\t\t"
+ out_str += GetPathForImage(task, dyld_all_image_infos_errorTargetDylibPath)
+ out_str += "\n"
+ out_str += "errorSymbol \t\t\t\t: {:#x}\n".format(dyld_all_image_infos_errorSymbol)
+ if dyld_all_image_infos_errorSymbol != 0:
+ out_str += "\t\t\t\t"
+ out_str += GetPathForImage(task, dyld_all_image_infos_errorSymbol)
+ out_str += "\n"
+
+ if dyld_all_image_infos_version >= 12:
+ out_str += "sharedCacheSlide \t\t\t: {:#x}\n".format(dyld_all_image_infos_sharedCacheSlide)
+ if dyld_all_image_infos_version >= 13 and dyld_all_image_infos_sharedCacheUUID != "":
+ out_str += "sharedCacheUUID \t\t\t: {:s}\n".format(dyld_all_image_infos_sharedCacheUUID)
+ else:
+ out_str += "No dyld information available for task\n"
+ print out_str
+
+# Macro: showosmalloc
+@lldb_type_summary(['OSMallocTag'])
+@header("{0: <20s} {1: >5s} {2: ^16s} {3: <5s} {4: <40s}".format("TAG", "COUNT", "STATE", "ATTR", "NAME"))
+def GetOSMallocTagSummary(malloc_tag):
+ """ Summarize the given OSMalloc tag.
+ params:
+ malloc_tag : value - value representing a _OSMallocTag_ * in kernel
+ returns:
+ out_str - string summary of the OSMalloc tag.
+ """
+ if not malloc_tag:
+ return "Invalid malloc tag value: 0x0"
+
+ out_str = "{: <#20x} {: >5d} {: ^#16x} {: <5d} {: <40s}\n".format(malloc_tag,
+ malloc_tag.OSMT_refcnt, malloc_tag.OSMT_state, malloc_tag.OSMT_attr, malloc_tag.OSMT_name)
+ return out_str
+
+@lldb_command('showosmalloc')
+def ShowOSMalloc(cmd_args=None):
+ """ Print the outstanding allocation count of OSMalloc tags
+ Usage: showosmalloc
+ """
+ summary_str = ""
+ tag_headp = Cast(addressof(kern.globals.OSMalloc_tag_list), 'struct _OSMallocTag_ *')
+ tagp = Cast(tag_headp.OSMT_link.next, 'struct _OSMallocTag_ *')
+ summary_str += GetOSMallocTagSummary.header + "\n"
+ while tagp != tag_headp:
+ summary_str += GetOSMallocTagSummary(tagp)
+ tagp = Cast(tagp.OSMT_link.next, 'struct _OSMallocTag_ *')
+
+ print summary_str
+
+# EndMacro: showosmalloc
+
+