xref: /xnu-8020.121.3/tools/lldbmacros/refgrp.py (revision fdd8201d7b966f0c3ea610489d29bd841d358941)
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