This is xnu-11215.1.10. See this file in:
"""
KernelManagement Triage commands
"""
from xnu import *
import sys, shlex
from utils import *
from ioreg import *
import xnudefines
import os.path
## Symbol names
WAITING_FOR_USER_SERVER_SYMNAME = '__WAITING_FOR_USER_SERVER__'
def GetTokenMemberSafe(token, fn, member):
try:
return fn(getattr(token, member))
except:
return '<error>'
# Macro: showthreadswaitingforuserserver
@lldb_command('showthreadswaitingforuserserver')
def ShowThreadsWaitingForUserServer(cmd_args=None):
"""
For each task thread that is in __WAITING_FOR_USER_SERVER__,
prints the thread backtrace, the IOUserServerCheckInToken structure, its server name, and tag.
Usage: showthreadswaitingforuserserver
"""
## Scan threads for interesting information
for t in kern.tasks:
for thread_obj in IterateQueue(t.threads, 'thread *', 'task_threads'):
show_bt = False
thread_val = GetLLDBThreadForKernelThread(thread_obj)
for frame in thread_val.frames:
function = frame.GetFunction()
if function and frame.GetFunctionName():
if frame.GetFunctionName().startswith(WAITING_FOR_USER_SERVER_SYMNAME):
show_bt = True
arguments = frame.get_arguments()
if len(arguments) > 0:
token_arg = arguments[0]
arg_addr = int(token_arg.value, 0)
if arg_addr:
token = kern.GetValueFromAddress(arg_addr, 'IOUserServerCheckInToken *')
print('fServerName="' + GetTokenMemberSafe(token, GetString, 'fServerName') + '"')
print('fExecutableName="' + GetTokenMemberSafe(token, GetString, 'fExecutableName') + '"')
print('fKextBundleID="' + GetTokenMemberSafe(token, GetString, 'fKextBundleID') + '"')
print('fServerTag=' + GetTokenMemberSafe(token, GetNumber, 'fServerTag'))
## Show entire thread summary and backtrace
if show_bt:
print(GetThreadSummary.header)
print(GetThreadSummary(thread_obj))
print(GetThreadBackTrace(thread_obj, prefix=" ") + "\n")
print('-----\n')
return
# EndMacro: showthreadswaitingforuserserver