This is xnu-11215.1.10. See this file in:
from xnu import *
@lldb_type_summary(['struct os_refgrp *'])
@header("{0: <18s} {1: <46s} {2: <9s} {3: <9s} {4: <9s} {5: <18s}"
.format("os_refgrp", "name", "count", "retain", "release", "log"))
def GetOSRefGrpSummary(refgrp):
""" Summarizes os_refgrp structure.
params: refgrp: value - value object representing an os_refgrp in
kernel
returns: str - summary of the os reference group
"""
format_string = "{0: <#18x} {1: <46s} {2: <9d} {3: <9d} {4: <9d} {5: <#18x}"
return format_string.format(refgrp, str(refgrp.grp_name),
refgrp.grp_count, refgrp.grp_retain_total,
refgrp.grp_release_total, refgrp.grp_log)
# Macro: showosrefgrp
@lldb_command('showosrefgrp')
def ShowOSRefGrpHelper(cmd_args=None):
""" Display a summary of the specified os reference group
Usage: showosrefgrp <refgrp address>
"""
refgrp = kern.GetValueFromAddress(cmd_args[0], 'struct os_refgrp *')
if not refgrp:
raise ArgumentError("Unknown arguments: {:s}".format(cmd_args[0]))
print(GetOSRefGrpSummary.header)
print(GetOSRefGrpSummary(refgrp))
# EndMacro: showosrefgrp
# Macro: showosrefgrphierarchy
@lldb_command('showosrefgrphierarchy')
def ShowOSRefGrpHierarchy(cmd_args=None):
""" Display the os reference group hiearchy associated with the specified
os reference group
Usage: showosrefgrphierarchy <refgrp address>
"""
refgrp = kern.GetValueFromAddress(cmd_args[0], 'struct os_refgrp *')
if not refgrp:
raise ArgumentError("Unknown arguments: {:s}".format(cmd_args[0]))
grps = []
parent = refgrp
while parent != 0:
grps.insert(0, parent)
parent = parent.grp_parent
for grp in grps:
print(GetOSRefGrpSummary(grp))
# EndMacro: showosrefgrphierarchy
# Macro: showglobaltaskrefgrps
@lldb_command('showglobaltaskrefgrps')
def ShowGlobalTaskRefGrps(cmd_args=None):
""" Display all global task reference count groups
Usage: showglobaltaskrefgrps
"""
print(GetOSRefGrpSummary.header)
# First print global groups
task_refgrp = kern.globals.task_refgrp
count = sizeof(task_refgrp) // sizeof('struct os_refgrp *')
i = 0
while i < count:
if task_refgrp[i].grp_retain_total != 0:
print(GetOSRefGrpSummary(task_refgrp[i]))
i += 1
# Then print kext groups
count = kern.globals.sKextAccountsCount
i = 0
while i < count:
a = GetObjectAtIndexFromArray(addressof(kern.globals.sKextAccounts[0]), i)
g = a.account.task_refgrp
if g.grp_retain_total != 0:
print(GetOSRefGrpSummary(addressof(g)))
i += 1
# EndMacro: showglobaltaskrefgrps
# Macro: showtaskrefgrps
@lldb_command('showtaskrefgrps')
def ShowTaskRefGrps(cmd_args=None):
""" Display per-task reference count groups
Usage: showtaskrefgrps <address of task>
"""
if not cmd_args:
raise ArgumentError("Invalid arguments passed.")
tval = kern.GetValueFromAddress(cmd_args[0], 'task *')
print(GetOSRefGrpSummary.header)
grp = tval.ref_group
if kern.globals.task_refgrp_config == 0:
count = 2
if kern.globals.task_refgrp_config == 1:
count = 8
if kern.globals.task_refgrp_config == 2:
count = 0
i = 0
while i < count:
if grp[i].grp_retain_total != 0:
print(GetOSRefGrpSummary(addressof(grp[i])))
i += 1
# EndMacro: showtaskrefgrps