xref: /xnu-8796.121.2/tools/lldbmacros/usertaskgdbserver.py (revision c54f35ca767986246321eb901baf8f5ff7923f6a)
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