1from __future__ import absolute_import, print_function 2 3from xnu import * 4import logging 5_usertaskdebugging_availabe = False 6try: 7 from usertaskdebugging import userprocess 8 from usertaskdebugging import gdbserver 9 _usertaskdebugging_availabe = True 10except ImportError: 11 pass 12 13def setupLogging(debug_level): 14 log_level = debug_level 15 log_filename = "/tmp/kdbserver.log" 16 logging.basicConfig(level=log_level, 17 format='%(asctime)s %(module)s %(levelname)s: %(message)s', 18 datefmt='%Y-%m-%d %H:%M:%S') 19 20 21@lldb_command('beginusertaskdebugging', 'DW') 22def DoUserTaskDebuggingServer(cmd_args = [], cmd_options ={}): 23 """ starts a gdb protocol server that is backed by <task_t> in kernel debugging session. 24 Usage: (lldb) beginusertaskdebugging <task_t> 25 options: -D for debug level logging 26 -W for warning level logging. 27 default is error level logging 28 """ 29 if not _usertaskdebugging_availabe: 30 print("You do not have the usertask debugging files available. ") 31 return 32 log_level = logging.INFO 33 if '-D' in cmd_options: 34 log_level = logging.DEBUG 35 elif '-W' in cmd_options: 36 log_level = logging.WARNING 37 38 setupLogging(debug_level=log_level) 39 if not cmd_args: 40 raise ArgumentError("Please provide valid task argument.") 41 42 t = kern.GetValueFromAddress(cmd_args[0], 'task_t') 43 44 up = userprocess.UserProcess(t) 45 gbs = gdbserver.GDBServer(up) 46 print("Starting debug session for %s at localhost:%d." % (GetProcNameForTask(t), gbs.portnum)) 47 gbs.run() 48 print("stopped the debug session") 49