1from __future__ import absolute_import, division, print_function 2 3from xnu import * 4 5 6@lldb_type_summary(['struct os_refgrp *']) 7@header("{0: <18s} {1: <46s} {2: <9s} {3: <9s} {4: <9s} {5: <18s}" 8 .format("os_refgrp", "name", "count", "retain", "release", "log")) 9def GetOSRefGrpSummary(refgrp): 10 """ Summarizes os_refgrp structure. 11 params: refgrp: value - value object representing an os_refgrp in 12 kernel 13 returns: str - summary of the os reference group 14 """ 15 16 format_string = "{0: <#18x} {1: <46s} {2: <9d} {3: <9d} {4: <9d} {5: <#18x}" 17 18 return format_string.format(refgrp, str(refgrp.grp_name), 19 refgrp.grp_count, refgrp.grp_retain_total, 20 refgrp.grp_release_total, refgrp.grp_log) 21 22# Macro: showosrefgrp 23@lldb_command('showosrefgrp') 24def ShowOSRefGrpHelper(cmd_args=None): 25 """ Display a summary of the specified os reference group 26 Usage: showosrefgrp <refgrp address> 27 """ 28 29 refgrp = kern.GetValueFromAddress(cmd_args[0], 'struct os_refgrp *') 30 if not refgrp: 31 raise ArgumentError("Unknown arguments: {:s}".format(cmd_args[0])) 32 33 print(GetOSRefGrpSummary.header) 34 print(GetOSRefGrpSummary(refgrp)) 35# EndMacro: showosrefgrp 36 37 38# Macro: showosrefgrphierarchy 39@lldb_command('showosrefgrphierarchy') 40def ShowOSRefGrpHierarchy(cmd_args=None): 41 """ Display the os reference group hiearchy associated with the specified 42 os reference group 43 Usage: showosrefgrphierarchy <refgrp address> 44 """ 45 46 refgrp = kern.GetValueFromAddress(cmd_args[0], 'struct os_refgrp *') 47 if not refgrp: 48 raise ArgumentError("Unknown arguments: {:s}".format(cmd_args[0])) 49 50 grps = [] 51 52 parent = refgrp 53 while parent != 0: 54 grps.insert(0, parent) 55 parent = parent.grp_parent 56 57 for grp in grps: 58 print(GetOSRefGrpSummary(grp)) 59# EndMacro: showosrefgrphierarchy 60 61# Macro: showglobaltaskrefgrps 62@lldb_command('showglobaltaskrefgrps') 63def ShowGlobalTaskRefGrps(cmd_args=None): 64 """ Display all global task reference count groups 65 Usage: showglobaltaskrefgrps 66 """ 67 68 print(GetOSRefGrpSummary.header) 69 70 # First print global groups 71 task_refgrp = kern.globals.task_refgrp 72 count = sizeof(task_refgrp) // sizeof('struct os_refgrp *') 73 i = 0 74 while i < count: 75 if task_refgrp[i].grp_retain_total != 0: 76 print(GetOSRefGrpSummary(task_refgrp[i])) 77 i += 1 78 79 # Then print kext groups 80 count = kern.globals.sKextAccountsCount 81 i = 0 82 while i < count: 83 a = GetObjectAtIndexFromArray(addressof(kern.globals.sKextAccounts[0]), i) 84 g = a.account.task_refgrp 85 86 if g.grp_retain_total != 0: 87 print(GetOSRefGrpSummary(addressof(g))) 88 i += 1 89# EndMacro: showglobaltaskrefgrps 90 91 92# Macro: showtaskrefgrps 93@lldb_command('showtaskrefgrps') 94def ShowTaskRefGrps(cmd_args=None): 95 """ Display per-task reference count groups 96 Usage: showtaskrefgrps <address of task> 97 """ 98 99 if not cmd_args: 100 raise ArgumentError("Invalid arguments passed.") 101 tval = kern.GetValueFromAddress(cmd_args[0], 'task *') 102 103 print(GetOSRefGrpSummary.header) 104 105 grp = tval.ref_group 106 if kern.globals.task_refgrp_config == 0: 107 count = 2 108 if kern.globals.task_refgrp_config == 1: 109 count = 8 110 if kern.globals.task_refgrp_config == 2: 111 count = 0 112 i = 0 113 while i < count: 114 if grp[i].grp_retain_total != 0: 115 print(GetOSRefGrpSummary(addressof(grp[i]))) 116 i += 1 117 118# EndMacro: showtaskrefgrps 119