xref: /xnu-8796.101.5/tools/lldbmacros/kmtriage.py (revision aca3beaa3dfbd42498b42c5e5ce20a938e6554e5)
1"""
2    KernelManagement Triage commands
3"""
4from __future__ import absolute_import, print_function
5
6from xnu import *
7import sys, shlex
8from utils import *
9from ioreg import *
10import xnudefines
11import os.path
12
13## Symbol names
14WAITING_FOR_USER_SERVER_SYMNAME = '__WAITING_FOR_USER_SERVER__'
15
16def GetTokenMemberSafe(token, fn, member):
17    try:
18        return fn(getattr(token, member))
19    except:
20        return '<error>'
21
22# Macro: showthreadswaitingforuserserver
23@lldb_command('showthreadswaitingforuserserver')
24def ShowThreadsWaitingForUserServer(cmd_args=None):
25    """
26    For each task thread that is in __WAITING_FOR_USER_SERVER__,
27    prints the thread backtrace, the IOUserServerCheckInToken structure, its server name, and tag.
28    Usage: showthreadswaitingforuserserver
29    """
30
31    ## Scan threads for interesting information
32    for t in kern.tasks:
33        for thread_obj in IterateQueue(t.threads, 'thread *', 'task_threads'):
34            show_bt = False
35            thread_val = GetLLDBThreadForKernelThread(thread_obj)
36            for frame in thread_val.frames:
37                function = frame.GetFunction()
38                if function and frame.GetFunctionName():
39                    if frame.GetFunctionName().startswith(WAITING_FOR_USER_SERVER_SYMNAME):
40                        show_bt = True
41                        arguments = frame.get_arguments()
42                        if len(arguments) > 0:
43                            token_arg = arguments[0]
44                            arg_addr = int(token_arg.value, 0)
45                            if arg_addr:
46                                token = kern.GetValueFromAddress(arg_addr, 'IOUserServerCheckInToken *')
47
48                                print('fServerName="' + GetTokenMemberSafe(token, GetString, 'fServerName') + '"')
49                                print('fExecutableName="' + GetTokenMemberSafe(token, GetString, 'fExecutableName') + '"')
50                                print('fKextBundleID="' + GetTokenMemberSafe(token, GetString, 'fKextBundleID') + '"')
51                                print('fServerTag=' + GetTokenMemberSafe(token, GetNumber, 'fServerTag'))
52
53            ## Show entire thread summary and backtrace
54            if show_bt:
55                print(GetThreadSummary.header)
56                print(GetThreadSummary(thread_obj))
57                print(GetThreadBackTrace(thread_obj, prefix="    ") + "\n")
58                print('-----\n')
59    return
60# EndMacro: showthreadswaitingforuserserver
61