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