147fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton#!/usr/bin/python 247fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton 347fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton#---------------------------------------------------------------------- 447fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton# This module will enable GDB remote packet logging when the 547fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton# 'start_gdb_log' command is called with a filename to log to. When the 647fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton# 'stop_gdb_log' command is called, it will disable the logging and 747fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton# print out statistics about how long commands took to execute and also 847fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton# will primnt ou 947fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton# Be sure to add the python path that points to the LLDB shared library. 1047fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton# 1147fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton# To use this in the embedded python interpreter using "lldb" just 1247fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton# import it with the full path using the "command script import" 1347fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton# command. This can be done from the LLDB command line: 1447fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton# (lldb) command script import /path/to/gdbremote.py 1547fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton# Or it can be added to your ~/.lldbinit file so this module is always 1647fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton# available. 1747fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton#---------------------------------------------------------------------- 1847fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton 1947fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Claytonimport commands 2047fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Claytonimport optparse 2147fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Claytonimport os 2247fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Claytonimport re 23e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Claytonimport shlex 24e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Claytonimport string 25e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Claytonimport sys 2647fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Claytonimport tempfile 2747fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton 281b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton#---------------------------------------------------------------------- 291b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton# Global variables 301b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton#---------------------------------------------------------------------- 311b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytong_log_file = '' 321b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytong_byte_order = 'little' 331b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton 34e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Claytonclass TerminalColors: 35e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton '''Simple terminal colors class''' 361b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton def __init__(self, enabled = True): 37e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton # TODO: discover terminal type from "file" and disable if 38e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton # it can't handle the color codes 39e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton self.enabled = enabled 40e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 41e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton def reset(self): 42e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton '''Reset all terminal colors and formatting.''' 43e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if self.enabled: 441b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return "\x1b[0m"; 451b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return '' 46e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 47e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton def bold(self, on = True): 48e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton '''Enable or disable bold depending on the "on" paramter.''' 49e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if self.enabled: 50e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if on: 511b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return "\x1b[1m"; 52e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 531b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return "\x1b[22m"; 541b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return '' 551b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton 56e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton def italics(self, on = True): 57e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton '''Enable or disable italics depending on the "on" paramter.''' 58e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if self.enabled: 59e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if on: 601b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return "\x1b[3m"; 61e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 621b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return "\x1b[23m"; 631b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return '' 641b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton 65e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton def underline(self, on = True): 66e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton '''Enable or disable underline depending on the "on" paramter.''' 67e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if self.enabled: 68e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if on: 691b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return "\x1b[4m"; 70e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 711b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return "\x1b[24m"; 721b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return '' 731b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton 74e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton def inverse(self, on = True): 75e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton '''Enable or disable inverse depending on the "on" paramter.''' 76e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if self.enabled: 77e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if on: 781b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return "\x1b[7m"; 79e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 801b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return "\x1b[27m"; 811b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return '' 821b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton 83e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton def strike(self, on = True): 84e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton '''Enable or disable strike through depending on the "on" paramter.''' 85e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if self.enabled: 86e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if on: 871b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return "\x1b[9m"; 88e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 891b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return "\x1b[29m"; 901b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return '' 911b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton 92e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton def black(self, fg = True): 93e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton '''Set the foreground or background color to black. 94e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton The foreground color will be set if "fg" tests True. The background color will be set if "fg" tests False.''' 95e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if self.enabled: 96e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if fg: 971b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return "\x1b[30m"; 98e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 991b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return "\x1b[40m"; 1001b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return '' 1011b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton 102e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton def red(self, fg = True): 103e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton '''Set the foreground or background color to red. 104e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton The foreground color will be set if "fg" tests True. The background color will be set if "fg" tests False.''' 105e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if self.enabled: 106e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if fg: 1071b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return "\x1b[31m"; 108e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 1091b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return "\x1b[41m"; 1101b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return '' 1111b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton 112e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton def green(self, fg = True): 113e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton '''Set the foreground or background color to green. 114e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton The foreground color will be set if "fg" tests True. The background color will be set if "fg" tests False.''' 115e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if self.enabled: 116e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if fg: 1171b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return "\x1b[32m"; 118e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 1191b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return "\x1b[42m"; 1201b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return '' 1211b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton 122e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton def yellow(self, fg = True): 123e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton '''Set the foreground or background color to yellow. 124e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton The foreground color will be set if "fg" tests True. The background color will be set if "fg" tests False.''' 125e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if self.enabled: 126e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if fg: 1271b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return "\x1b[43m"; 128e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 1291b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return "\x1b[33m"; 1301b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return '' 1311b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton 132e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton def blue(self, fg = True): 133e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton '''Set the foreground or background color to blue. 134e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton The foreground color will be set if "fg" tests True. The background color will be set if "fg" tests False.''' 135e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if self.enabled: 136e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if fg: 1371b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return "\x1b[34m"; 138e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 1391b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return "\x1b[44m"; 1401b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return '' 1411b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton 142e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton def magenta(self, fg = True): 143e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton '''Set the foreground or background color to magenta. 144e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton The foreground color will be set if "fg" tests True. The background color will be set if "fg" tests False.''' 145e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if self.enabled: 146e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if fg: 1471b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return "\x1b[35m"; 148e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 1491b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return "\x1b[45m"; 1501b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return '' 1511b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton 152e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton def cyan(self, fg = True): 153e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton '''Set the foreground or background color to cyan. 154e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton The foreground color will be set if "fg" tests True. The background color will be set if "fg" tests False.''' 155e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if self.enabled: 156e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if fg: 1571b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return "\x1b[36m"; 158e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 1591b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return "\x1b[46m"; 1601b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return '' 1611b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton 162e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton def white(self, fg = True): 163e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton '''Set the foreground or background color to white. 164e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton The foreground color will be set if "fg" tests True. The background color will be set if "fg" tests False.''' 165e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if self.enabled: 166e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if fg: 1671b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return "\x1b[37m"; 168e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 1691b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return "\x1b[47m"; 1701b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return '' 1711b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton 172e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton def default(self, fg = True): 173e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton '''Set the foreground or background color to the default. 174e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton The foreground color will be set if "fg" tests True. The background color will be set if "fg" tests False.''' 175e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if self.enabled: 176e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if fg: 1771b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return "\x1b[39m"; 178e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 1791b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return "\x1b[49m"; 1801b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return '' 181e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 18247fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton 18347fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Claytondef start_gdb_log(debugger, command, result, dict): 18447fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton '''Start logging GDB remote packets by enabling logging with timestamps and 18547fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton thread safe logging. Follow a call to this function with a call to "stop_gdb_log" 18647fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton in order to dump out the commands.''' 187e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton global g_log_file 18847fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton command_args = shlex.split(command) 18947fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton usage = "usage: start_gdb_log [options] [<LOGFILEPATH>]" 19047fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton description='''The command enables GDB remote packet logging with timestamps. The packets will be logged to <LOGFILEPATH> if supplied, or a temporary file will be used. Logging stops when stop_gdb_log is called and the packet times will 19147fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton be aggregated and displayed.''' 19247fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton parser = optparse.OptionParser(description=description, prog='start_gdb_log',usage=usage) 19347fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton parser.add_option('-v', '--verbose', action='store_true', dest='verbose', help='display verbose debug info', default=False) 19447fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton try: 19547fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton (options, args) = parser.parse_args(command_args) 19647fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton except: 19747fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton return 19847fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton 199e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if g_log_file: 200e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton result.PutCString ('error: logging is already in progress with file "%s"', g_log_file) 20147fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton else: 20247fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton args_len = len(args) 20347fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton if args_len == 0: 204e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton g_log_file = tempfile.mktemp() 20547fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton elif len(args) == 1: 206e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton g_log_file = args[0] 20747fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton 208e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if g_log_file: 209e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton debugger.HandleCommand('log enable --threadsafe --timestamp --file "%s" gdb-remote packets' % g_log_file); 210e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton result.PutCString ("GDB packet logging enable with log file '%s'\nUse the 'stop_gdb_log' command to stop logging and show packet statistics." % g_log_file) 21147fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton return 21247fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton 21347fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton result.PutCString ('error: invalid log file path') 21447fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton result.PutCString (usage) 21547fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton 21647fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Claytondef stop_gdb_log(debugger, command, result, dict): 21747fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton '''Stop logging GDB remote packets to the file that was specified in a call 21847fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton to "start_gdb_log" and normalize the timestamps to be relative to the first 21947fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton timestamp in the log file. Also print out statistics for how long each 22047fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton command took to allow performance bottlenecks to be determined.''' 221e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton global g_log_file 22247fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton # Any commands whose names might be followed by more valid C identifier 22347fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton # characters must be listed here 22447fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton command_args = shlex.split(command) 22547fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton usage = "usage: stop_gdb_log [options]" 22647fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton description='''The command stops a previously enabled GDB remote packet logging command. Packet logging must have been previously enabled with a call to start_gdb_log.''' 22747fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton parser = optparse.OptionParser(description=description, prog='stop_gdb_log',usage=usage) 22847fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton parser.add_option('-v', '--verbose', action='store_true', dest='verbose', help='display verbose debug info', default=False) 22947fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton parser.add_option('-q', '--quiet', action='store_true', dest='quiet', help='display verbose debug info', default=False) 2301b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton parser.add_option('-C', '--color', action='store_true', dest='color', help='add terminal colors', default=False) 23177ce90bc96f26ee707ae3ef3ba62099a7c3dc8fdJim Ingham parser.add_option('-c', '--sort-by-count', action='store_true', dest='sort_count', help='display verbose debug info', default=False) 2321b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton parser.add_option('-s', '--symbolicate', action='store_true', dest='symbolicate', help='symbolicate addresses in log using current "lldb.target"', default=False) 23347fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton try: 23447fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton (options, args) = parser.parse_args(command_args) 23547fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton except: 23647fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton return 2371b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton options.colors = TerminalColors(options.color) 2381b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton options.symbolicator = None 2391b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton if options.symbolicate: 2401b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton if lldb.target: 2411b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton import lldb.utils.symbolication 2421b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton options.symbolicator = lldb.utils.symbolication.Symbolicator() 2431b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton options.symbolicator.target = lldb.target 2441b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton else: 2451b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton print "error: can't symbolicate without a target" 24647fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton 247e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if not g_log_file: 24847fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton result.PutCString ('error: logging must have been previously enabled with a call to "stop_gdb_log"') 249e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton elif os.path.exists (g_log_file): 25047fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton if len(args) == 0: 25147fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton debugger.HandleCommand('log disable gdb-remote packets'); 252e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton result.PutCString ("GDB packet logging disabled. Logged packets are in '%s'" % g_log_file) 253e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton parse_gdb_log_file (g_log_file, options) 25447fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton else: 25547fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton result.PutCString (usage) 25647fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton else: 257e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print 'error: the GDB packet log file "%s" does not exist' % g_log_file 258e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 259e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Claytondef is_hex_byte(str): 260e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if len(str) == 2: 261e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton return str[0] in string.hexdigits and str[1] in string.hexdigits; 262e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton return False 263e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 264e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton# global register info list 265e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Claytong_register_infos = list() 266e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Claytong_max_register_info_name_len = 0 267e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 268e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Claytonclass RegisterInfo: 269e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton """Class that represents register information""" 270e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton def __init__(self, kvp): 271e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton self.info = dict() 272e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton for kv in kvp: 273e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton key = kv[0] 274e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton value = kv[1] 275e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton self.info[key] = value 276e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton def name(self): 277e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton '''Get the name of the register.''' 278e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if self.info and 'name' in self.info: 279e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton return self.info['name'] 280e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton return None 281e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 282e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton def bit_size(self): 283e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton '''Get the size in bits of the register.''' 284e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if self.info and 'bitsize' in self.info: 285e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton return int(self.info['bitsize']) 286e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton return 0 287e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 288e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton def byte_size(self): 289e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton '''Get the size in bytes of the register.''' 290e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton return self.bit_size() / 8 291e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 292e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton def get_value_from_hex_string(self, hex_str): 293e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton '''Dump the register value given a native byte order encoded hex ASCII byte string.''' 294e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton encoding = self.info['encoding'] 295e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton bit_size = self.bit_size() 296e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton packet = Packet(hex_str) 297e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if encoding == 'uint': 298e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton uval = packet.get_hex_uint(g_byte_order) 299e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if bit_size == 8: 300e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton return '0x%2.2x' % (uval) 301e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton elif bit_size == 16: 302e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton return '0x%4.4x' % (uval) 303e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton elif bit_size == 32: 304e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton return '0x%8.8x' % (uval) 305e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton elif bit_size == 64: 306e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton return '0x%16.16x' % (uval) 307e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton bytes = list(); 308e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton uval = packet.get_hex_uint8() 309e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton while uval != None: 310e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton bytes.append(uval) 311e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton uval = packet.get_hex_uint8() 312e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton value_str = '0x' 313e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if g_byte_order == 'little': 314e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton bytes.reverse() 315e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton for byte in bytes: 316e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton value_str += '%2.2x' % byte 317e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton return '%s' % (value_str) 318e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 319e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton def __str__(self): 320e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton '''Dump the register info key/value pairs''' 321e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton s = '' 322e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton for key in self.info.keys(): 323e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if s: 324e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton s += ', ' 325e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton s += "%s=%s " % (key, self.info[key]) 326e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton return s 327e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 328e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Claytonclass Packet: 329e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton """Class that represents a packet that contains string data""" 330e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton def __init__(self, packet_str): 331e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton self.str = packet_str 332e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 333e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton def peek_char(self): 334e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton ch = 0 335e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if self.str: 336e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton ch = self.str[0] 337e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton return ch 338e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 339e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton def get_char(self): 340e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton ch = 0 341e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if self.str: 342e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton ch = self.str[0] 343e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton self.str = self.str[1:] 344e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton return ch 345e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 346e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton def get_hex_uint8(self): 347e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if self.str and len(self.str) >= 2 and self.str[0] in string.hexdigits and self.str[1] in string.hexdigits: 348e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton uval = int(self.str[0:2], 16) 349e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton self.str = self.str[2:] 350e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton return uval 351e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton return None 352e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 353e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton def get_hex_uint16(self, byte_order): 354e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton uval = 0 355e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if byte_order == 'big': 356e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton uval |= self.get_hex_uint8() << 8 357e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton uval |= self.get_hex_uint8() 358e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 359e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton uval |= self.get_hex_uint8() 360e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton uval |= self.get_hex_uint8() << 8 361e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton return uval 362e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 363e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton def get_hex_uint32(self, byte_order): 364e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton uval = 0 365e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if byte_order == 'big': 366e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton uval |= self.get_hex_uint8() << 24 367e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton uval |= self.get_hex_uint8() << 16 368e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton uval |= self.get_hex_uint8() << 8 369e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton uval |= self.get_hex_uint8() 370e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 371e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton uval |= self.get_hex_uint8() 372e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton uval |= self.get_hex_uint8() << 8 373e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton uval |= self.get_hex_uint8() << 16 374e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton uval |= self.get_hex_uint8() << 24 375e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton return uval 376e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 377e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton def get_hex_uint64(self, byte_order): 378e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton uval = 0 379e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if byte_order == 'big': 380e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton uval |= self.get_hex_uint8() << 56 381e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton uval |= self.get_hex_uint8() << 48 382e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton uval |= self.get_hex_uint8() << 40 383e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton uval |= self.get_hex_uint8() << 32 384e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton uval |= self.get_hex_uint8() << 24 385e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton uval |= self.get_hex_uint8() << 16 386e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton uval |= self.get_hex_uint8() << 8 387e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton uval |= self.get_hex_uint8() 388e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 389e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton uval |= self.get_hex_uint8() 390e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton uval |= self.get_hex_uint8() << 8 391e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton uval |= self.get_hex_uint8() << 16 392e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton uval |= self.get_hex_uint8() << 24 393e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton uval |= self.get_hex_uint8() << 32 394e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton uval |= self.get_hex_uint8() << 40 395e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton uval |= self.get_hex_uint8() << 48 396e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton uval |= self.get_hex_uint8() << 56 397e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton return uval 398e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 399e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton def get_hex_chars(self, n = 0): 400e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton str_len = len(self.str) 401e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if n == 0: 402e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton # n was zero, so we need to determine all hex chars and 403e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton # stop when we hit the end of the string of a non-hex character 404e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton while n < str_len and self.str[n] in string.hexdigits: 405e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton n = n + 1 406e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 407e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if n > str_len: 408e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton return None # Not enough chars 409e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton # Verify all chars are hex if a length was specified 410e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton for i in range(n): 411e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if self.str[i] not in string.hexdigits: 412e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton return None # Not all hex digits 413e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if n == 0: 414e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton return None 415e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton hex_str = self.str[0:n] 416e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton self.str = self.str[n:] 417e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton return hex_str 418e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 419e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton def get_hex_uint(self, byte_order, n = 0): 420e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if byte_order == 'big': 421e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton hex_str = self.get_hex_chars(n) 422e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if hex_str == None: 423e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton return None 424e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton return int(hex_str, 16) 425e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 426e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton uval = self.get_hex_uint8() 427e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if uval == None: 428e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton return None 429e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton uval_result = 0 430e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton shift = 0 431e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton while uval != None: 432e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton uval_result |= (uval << shift) 433e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton shift += 8 434e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton uval = self.get_hex_uint8() 435e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton return uval_result 436e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 437e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton def get_key_value_pairs(self): 438e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton kvp = list() 439e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton key_value_pairs = string.split(self.str, ';') 440e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton for key_value_pair in key_value_pairs: 441e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if len(key_value_pair): 442e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton kvp.append(string.split(key_value_pair, ':')) 443e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton return kvp 444e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 445e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton def split(self, ch): 446e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton return string.split(self.str, ch) 447e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 448e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton def split_hex(self, ch, byte_order): 449e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton hex_values = list() 450e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton strings = string.split(self.str, ch) 451e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton for str in strings: 452e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton hex_values.append(Packet(str).get_hex_uint(byte_order)) 453e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton return hex_values 454e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 455e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton def __str__(self): 456e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton return self.str 457e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 458e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton def __len__(self): 459e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton return len(self.str) 460e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 461e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Claytong_thread_suffix_regex = re.compile(';thread:([0-9a-fA-F]+);') 462e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Claytondef get_thread_from_thread_suffix(str): 463e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if str: 464e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton match = g_thread_suffix_regex.match (str) 465e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if match: 466e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton return int(match.group(1), 16) 467e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton return None 468e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 4691b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef cmd_stop_reply(options, cmd, args): 470e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print "get_last_stop_info()" 471e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 4721b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef rsp_stop_reply(options, cmd, cmd_args, rsp): 473e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton global g_byte_order 474e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton packet = Packet(rsp) 475e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton stop_type = packet.get_char() 476e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if stop_type == 'T' or stop_type == 'S': 477e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton signo = packet.get_hex_uint8() 478e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print ' signal = %i' % signo 479e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton key_value_pairs = packet.get_key_value_pairs() 480e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton for key_value_pair in key_value_pairs: 481e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton key = key_value_pair[0] 482e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton value = key_value_pair[1] 483e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if is_hex_byte(key): 484e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton reg_num = Packet(key).get_hex_uint8() 4851b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton print ' ' + get_register_name_equal_value (options, reg_num, value) 486e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 487e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print ' %s = %s' % (key, value) 488e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton elif stop_type == 'W': 489e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton exit_status = packet.get_hex_uint8() 490e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print 'exit (status=%i)' % exit_status 491e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton elif stop_type == 'O': 492e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print 'stdout = %s' % packet.str 493e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 494e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 4951b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef cmd_unknown_packet(options, cmd, args): 496e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if args: 497e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print "cmd: %s, args: %s", cmd, args 498e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 499e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print "cmd: %s", cmd 500e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 5011b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef cmd_query_packet(options, cmd, args): 502e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if args: 5031b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton print "query: %s, args: %s" % (cmd, args) 504e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 5051b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton print "query: %s" % (cmd) 50647fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton 507e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Claytondef rsp_ok_error(rsp): 508e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print "rsp: ", rsp 509e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 5101b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef rsp_ok_means_supported(options, cmd, cmd_args, rsp): 511e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if rsp == 'OK': 512e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print "%s%s is supported" % (cmd, cmd_args) 513e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton elif rsp == '': 514e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print "%s%s is not supported" % (cmd, cmd_args) 515e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 516e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print "%s%s -> %s" % (cmd, cmd_args, rsp) 517e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 5181b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef rsp_ok_means_success(options, cmd, cmd_args, rsp): 519e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if rsp == 'OK': 520e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print "success" 521e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton elif rsp == '': 522e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print "%s%s is not supported" % (cmd, cmd_args) 523e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 524e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print "%s%s -> %s" % (cmd, cmd_args, rsp) 525e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 5261b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef rsp_dump_key_value_pairs(options, cmd, cmd_args, rsp): 527e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if rsp: 528e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton packet = Packet(rsp) 529e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton key_value_pairs = packet.get_key_value_pairs() 530e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton for key_value_pair in key_value_pairs: 531e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton key = key_value_pair[0] 532e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton value = key_value_pair[1] 533e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print " %s = %s" % (key, value) 534e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 535e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print "not supported" 536e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 5371b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef cmd_vCont(options, cmd, args): 538e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if args == '?': 539e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print "%s: get supported extended continue modes" % (cmd) 540e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 541e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton got_other_threads = 0 542e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton s = '' 543e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton for thread_action in string.split(args[1:], ';'): 544e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton (short_action, thread) = string.split(thread_action, ':') 545e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton tid = int(thread, 16) 546e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if short_action == 'c': 547e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton action = 'continue' 548e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton elif short_action == 's': 549e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton action = 'step' 550e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton elif short_action[0] == 'C': 551e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton action = 'continue with signal 0x%s' % (short_action[1:]) 552e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton elif short_action == 'S': 553e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton action = 'step with signal 0x%s' % (short_action[1:]) 554e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 555e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton action = short_action 556e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if s: 557e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton s += ', ' 558e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if tid == -1: 559e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton got_other_threads = 1 560e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton s += 'other-threads:' 561e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 562e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton s += 'thread 0x%4.4x: %s' % (tid, action) 563e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if got_other_threads: 564e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print "extended_continue (%s)" % (s) 565e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 566e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print "extended_continue (%s, other-threads: suspend)" % (s) 567e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 5681b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef rsp_vCont(options, cmd, cmd_args, rsp): 569e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if cmd_args == '?': 570e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton # Skip the leading 'vCont;' 571e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton rsp = rsp[6:] 572e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton modes = string.split(rsp, ';') 573e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton s = "%s: supported extended continue modes include: " % (cmd) 574e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 575e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton for i, mode in enumerate(modes): 576e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if i: 577e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton s += ', ' 578e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if mode == 'c': 579e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton s += 'continue' 580e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton elif mode == 'C': 581e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton s += 'continue with signal' 582e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton elif mode == 's': 583e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton s += 'step' 584e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton elif mode == 'S': 585e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton s += 'step with signal' 586e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 587e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton s += 'unrecognized vCont mode: ', mode 588e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print s 589e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton elif rsp: 590e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if rsp[0] == 'T' or rsp[0] == 'S' or rsp[0] == 'W' or rsp[0] == 'X': 5911b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton rsp_stop_reply (options, cmd, cmd_args, rsp) 592e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton return 593e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if rsp[0] == 'O': 594e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print "stdout: %s" % (rsp) 595e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton return 596e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 597e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print "not supported (cmd = '%s', args = '%s', rsp = '%s')" % (cmd, cmd_args, rsp) 598e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 5991b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef cmd_vAttach(options, cmd, args): 600e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton (extra_command, args) = string.split(args, ';') 601e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if extra_command: 602e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print "%s%s(%s)" % (cmd, extra_command, args) 603e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 604e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print "attach_pid(%s)" % args 605e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 6061b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef cmd_qRegisterInfo(options, cmd, args): 607e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print 'query_register_info(reg_num=%i)' % (int(args, 16)) 608e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 6091b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef rsp_qRegisterInfo(options, cmd, cmd_args, rsp): 610e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton global g_max_register_info_name_len 611e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print 'query_register_info(reg_num=%i):' % (int(cmd_args, 16)), 612e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if len(rsp) == 3 and rsp[0] == 'E': 613e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton g_max_register_info_name_len = 0 614e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton for reg_info in g_register_infos: 615e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton name_len = len(reg_info.name()) 616e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if g_max_register_info_name_len < name_len: 617e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton g_max_register_info_name_len = name_len 618e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print' DONE' 619e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 620e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton packet = Packet(rsp) 621e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton reg_info = RegisterInfo(packet.get_key_value_pairs()) 622e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton g_register_infos.append(reg_info) 623e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print reg_info 624e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 625e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 6261b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef cmd_qThreadInfo(options, cmd, args): 627e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if cmd == 'qfThreadInfo': 628e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton query_type = 'first' 629e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 630e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton query_type = 'subsequent' 631e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print 'get_current_thread_list(type=%s)' % (query_type) 632e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 6331b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef rsp_qThreadInfo(options, cmd, cmd_args, rsp): 634e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton packet = Packet(rsp) 635e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton response_type = packet.get_char() 636e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if response_type == 'm': 637e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton tids = packet.split_hex(';', 'big') 638e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton for i, tid in enumerate(tids): 639e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if i: 640e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print ',', 641e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print '0x%x' % (tid), 642e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print 643e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton elif response_type == 'l': 644e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print 'END' 645e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 6461b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef rsp_hex_big_endian(options, cmd, cmd_args, rsp): 647e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton packet = Packet(rsp) 648e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton uval = packet.get_hex_uint('big') 649e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print '%s: 0x%x' % (cmd, uval) 650e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 6511b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef cmd_read_memory(options, cmd, args): 652e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton packet = Packet(args) 653e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton addr = packet.get_hex_uint('big') 654e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton comma = packet.get_char() 655e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton size = packet.get_hex_uint('big') 656e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print 'read_memory (addr = 0x%x, size = %u)' % (addr, size) 657e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 658e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Claytondef dump_hex_memory_buffer(addr, hex_byte_str): 659e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton packet = Packet(hex_byte_str) 660e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton idx = 0 661e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton ascii = '' 662e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton uval = packet.get_hex_uint8() 663e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton while uval != None: 664e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if ((idx % 16) == 0): 665e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if ascii: 666e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print ' ', ascii 667e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton ascii = '' 668e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print '0x%x:' % (addr + idx), 669e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print '%2.2x' % (uval), 670e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if 0x20 <= uval and uval < 0x7f: 671e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton ascii += '%c' % uval 672e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 673e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton ascii += '.' 674e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton uval = packet.get_hex_uint8() 675e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton idx = idx + 1 676e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if ascii: 677e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print ' ', ascii 678e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton ascii = '' 679e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 6801b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef cmd_write_memory(options, cmd, args): 681e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton packet = Packet(args) 682e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton addr = packet.get_hex_uint('big') 683e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if packet.get_char() != ',': 684e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print 'error: invalid write memory command (missing comma after address)' 685e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton return 686e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton size = packet.get_hex_uint('big') 687e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if packet.get_char() != ':': 688e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print 'error: invalid write memory command (missing colon after size)' 689e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton return 690e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print 'write_memory (addr = 0x%x, size = %u, data:' % (addr, size) 691e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton dump_hex_memory_buffer (addr, packet.str) 692e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 6931b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef cmd_alloc_memory(options, cmd, args): 694e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton packet = Packet(args) 695e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton byte_size = packet.get_hex_uint('big') 696e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if packet.get_char() != ',': 697e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print 'error: invalid allocate memory command (missing comma after address)' 698e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton return 699e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print 'allocate_memory (byte-size = %u (0x%x), permissions = %s)' % (byte_size, byte_size, packet.str) 700e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 7011b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef rsp_alloc_memory(options, cmd, cmd_args, rsp): 702e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton packet = Packet(rsp) 703e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton addr = packet.get_hex_uint('big') 704e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print 'addr = 0x%x' % addr 705e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 7061b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef cmd_dealloc_memory(options, cmd, args): 707e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton packet = Packet(args) 708e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton addr = packet.get_hex_uint('big') 709e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if packet.get_char() != ',': 710e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print 'error: invalid allocate memory command (missing comma after address)' 711e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton return 712e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print 'deallocate_memory (addr = 0x%x, permissions = %s)' % (addr, packet.str) 713e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 7141b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef rsp_memory_bytes(options, cmd, cmd_args, rsp): 715e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton addr = Packet(cmd_args).get_hex_uint('big') 716e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton dump_hex_memory_buffer (addr, rsp) 717e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 7181b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef get_register_name_equal_value(options, reg_num, hex_value_str): 719e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if reg_num < len(g_register_infos): 720e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton reg_info = g_register_infos[reg_num] 7211b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton value_str = reg_info.get_value_from_hex_string (hex_value_str) 7221b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton s = reg_info.name() + ' = ' 7231b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton if options.symbolicator: 7241b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton symbolicated_addresses = options.symbolicator.symbolicate (int(value_str, 0)) 7251b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton if symbolicated_addresses: 7261b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton s += options.colors.magenta() 7271b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton s += '%s' % symbolicated_addresses[0] 7281b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton s += options.colors.reset() 7291b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return s 7301b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton s += value_str 7311b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton return s 732e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 733e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton reg_value = Packet(hex_value_str).get_hex_uint(g_byte_order) 734e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton return 'reg(%u) = 0x%x' % (reg_num, reg_value) 735e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 7361b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef cmd_read_one_reg(options, cmd, args): 737e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton packet = Packet(args) 738e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton reg_num = packet.get_hex_uint('big') 739e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton tid = get_thread_from_thread_suffix (packet.str) 740e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton name = None 741e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if reg_num < len(g_register_infos): 742e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton name = g_register_infos[reg_num].name () 743e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if packet.str: 744e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton packet.get_char() # skip ; 745e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton thread_info = packet.get_key_value_pairs() 746e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton tid = int(thread_info[0][1], 16) 747e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton s = 'read_register (reg_num=%u' % reg_num 748e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if name: 749e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton s += ' (%s)' % (name) 750e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if tid != None: 751e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton s += ', tid = 0x%4.4x' % (tid) 752e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton s += ')' 753e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print s 754e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 7551b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef rsp_read_one_reg(options, cmd, cmd_args, rsp): 756e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton packet = Packet(cmd_args) 757e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton reg_num = packet.get_hex_uint('big') 7581b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton print get_register_name_equal_value (options, reg_num, rsp) 759e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 7601b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef cmd_write_one_reg(options, cmd, args): 761e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton packet = Packet(args) 762e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton reg_num = packet.get_hex_uint('big') 763e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if packet.get_char() != '=': 764e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print 'error: invalid register write packet' 765e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 766e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton name = None 767e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton hex_value_str = packet.get_hex_chars() 768e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton tid = get_thread_from_thread_suffix (packet.str) 769e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton s = 'write_register (reg_num=%u' % reg_num 770e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if name: 771e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton s += ' (%s)' % (name) 772e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton s += ', value = ' 7731b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton s += get_register_name_equal_value(options, reg_num, hex_value_str) 774e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if tid != None: 775e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton s += ', tid = 0x%4.4x' % (tid) 776e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton s += ')' 777e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print s 778e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 779e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Claytondef dump_all_regs(packet): 780e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton for reg_info in g_register_infos: 781e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton nibble_size = reg_info.bit_size() / 4 782e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton hex_value_str = packet.get_hex_chars(nibble_size) 783e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if hex_value_str != None: 784e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton value = reg_info.get_value_from_hex_string (hex_value_str) 785e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print '%*s = %s' % (g_max_register_info_name_len, reg_info.name(), value) 786e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 787e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton return 788e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 789e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Claytondef cmd_read_all_regs(cmd, cmd_args): 790e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton packet = Packet(cmd_args) 791e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton packet.get_char() # toss the 'g' command character 792e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton tid = get_thread_from_thread_suffix (packet.str) 793e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if tid != None: 794e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print 'read_all_register(thread = 0x%4.4x)' % tid 795e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 796e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print 'read_all_register()' 797e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 7981b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef rsp_read_all_regs(options, cmd, cmd_args, rsp): 799e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton packet = Packet(rsp) 800e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton dump_all_regs (packet) 801e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 8021b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef cmd_write_all_regs(options, cmd, args): 803e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton packet = Packet(args) 804e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print 'write_all_registers()' 805e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton dump_all_regs (packet) 806e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 807e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Claytong_bp_types = [ "software_bp", "hardware_bp", "write_wp", "read_wp", "access_wp" ] 808e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 8091b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef cmd_bp(options, cmd, args): 810e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if cmd == 'Z': 811e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton s = 'set_' 812e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 813e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton s = 'clear_' 814e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton packet = Packet (args) 815e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton bp_type = packet.get_hex_uint('big') 816e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton packet.get_char() # Skip , 817e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton bp_addr = packet.get_hex_uint('big') 818e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton packet.get_char() # Skip , 819e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton bp_size = packet.get_hex_uint('big') 820e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton s += g_bp_types[bp_type] 821e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton s += " (addr = 0x%x, size = %u)" % (bp_addr, bp_size) 822e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print s 823e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 8241b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef cmd_mem_rgn_info(options, cmd, args): 825e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton packet = Packet(args) 826e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton packet.get_char() # skip ':' character 827e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton addr = packet.get_hex_uint('big') 828e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print 'get_memory_region_info (addr=0x%x)' % (addr) 829e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 8301b62f5967aa04ebde2ae163f12c739a6740596e2Greg Claytondef cmd_kill(options, cmd, args): 831e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print 'kill_process()' 832e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 833e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Claytongdb_remote_commands = { 834e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton '\\?' : { 'cmd' : cmd_stop_reply , 'rsp' : rsp_stop_reply , 'name' : "stop reply pacpket"}, 835e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 'QStartNoAckMode' : { 'cmd' : cmd_query_packet , 'rsp' : rsp_ok_means_supported , 'name' : "query if no ack mode is supported"}, 836e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 'QThreadSuffixSupported' : { 'cmd' : cmd_query_packet , 'rsp' : rsp_ok_means_supported , 'name' : "query if thread suffix is supported" }, 837e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 'QListThreadsInStopReply' : { 'cmd' : cmd_query_packet , 'rsp' : rsp_ok_means_supported , 'name' : "query if threads in stop reply packets are supported" }, 838a809180cc9528dff68ecea61ab21695d383dea82Greg Clayton 'qVAttachOrWaitSupported' : { 'cmd' : cmd_query_packet , 'rsp' : rsp_ok_means_supported , 'name' : "query if threads attach with optional wait is supported" }, 839e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 'qHostInfo' : { 'cmd' : cmd_query_packet , 'rsp' : rsp_dump_key_value_pairs, 'name' : "get host information" }, 840e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 'vCont' : { 'cmd' : cmd_vCont , 'rsp' : rsp_vCont , 'name' : "extended continue command" }, 841e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 'vAttach' : { 'cmd' : cmd_vAttach , 'rsp' : rsp_stop_reply , 'name' : "attach to process" }, 842e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 'qRegisterInfo' : { 'cmd' : cmd_qRegisterInfo , 'rsp' : rsp_qRegisterInfo , 'name' : "query register info" }, 843e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 'qfThreadInfo' : { 'cmd' : cmd_qThreadInfo , 'rsp' : rsp_qThreadInfo , 'name' : "get current thread list" }, 844e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 'qsThreadInfo' : { 'cmd' : cmd_qThreadInfo , 'rsp' : rsp_qThreadInfo , 'name' : "get current thread list" }, 845e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 'qShlibInfoAddr' : { 'cmd' : cmd_query_packet , 'rsp' : rsp_hex_big_endian , 'name' : "get shared library info address" }, 846e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 'qMemoryRegionInfo' : { 'cmd' : cmd_mem_rgn_info , 'rsp' : rsp_dump_key_value_pairs, 'name' : "get memory region information" }, 847e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 'm' : { 'cmd' : cmd_read_memory , 'rsp' : rsp_memory_bytes , 'name' : "read memory" }, 848e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 'M' : { 'cmd' : cmd_write_memory , 'rsp' : rsp_ok_means_success , 'name' : "write memory" }, 849e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton '_M' : { 'cmd' : cmd_alloc_memory , 'rsp' : rsp_alloc_memory , 'name' : "allocate memory" }, 850e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton '_m' : { 'cmd' : cmd_dealloc_memory, 'rsp' : rsp_ok_means_success , 'name' : "deallocate memory" }, 851e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 'p' : { 'cmd' : cmd_read_one_reg , 'rsp' : rsp_read_one_reg , 'name' : "read single register" }, 852e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 'P' : { 'cmd' : cmd_write_one_reg , 'rsp' : rsp_ok_means_success , 'name' : "write single register" }, 853e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 'g' : { 'cmd' : cmd_read_all_regs , 'rsp' : rsp_read_all_regs , 'name' : "read all registers" }, 854e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 'G' : { 'cmd' : cmd_write_all_regs, 'rsp' : rsp_ok_means_success , 'name' : "write all registers" }, 855e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 'z' : { 'cmd' : cmd_bp , 'rsp' : rsp_ok_means_success , 'name' : "clear breakpoint or watchpoint" }, 856e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 'Z' : { 'cmd' : cmd_bp , 'rsp' : rsp_ok_means_success , 'name' : "set breakpoint or watchpoint" }, 857e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 'k' : { 'cmd' : cmd_kill , 'rsp' : rsp_stop_reply , 'name' : "kill process" }, 858e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton} 85947fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Claytondef parse_gdb_log_file(file, options): 86047fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton '''Parse a GDB log file that was generated by enabling logging with: 86147fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton (lldb) log enable --threadsafe --timestamp --file <FILE> gdb-remote packets 86247fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton This log file will contain timestamps and this fucntion will then normalize 86347fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton those packets to be relative to the first value timestamp that is found and 86447fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton show delta times between log lines and also keep track of how long it takes 86547fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton for GDB remote commands to make a send/receive round trip. This can be 86647fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton handy when trying to figure out why some operation in the debugger is taking 86747fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton a long time during a preset set of debugger commands.''' 86847fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton 86947fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton tricky_commands = [ 'qRegisterInfo' ] 87047fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton timestamp_regex = re.compile('(\s*)([1-9][0-9]+\.[0-9]+)([^0-9].*)$') 87147fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton packet_name_regex = re.compile('([A-Za-z_]+)[^a-z]') 872e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton packet_transmit_name_regex = re.compile('(?P<direction>send|read) packet: (?P<packet>.*)') 873e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton packet_contents_name_regex = re.compile('\$([^#]+)#[0-9a-fA-F]{2}') 874e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton packet_names_regex_str = '(' + '|'.join(gdb_remote_commands.keys()) + ')(.*)'; 875e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton packet_names_regex = re.compile(packet_names_regex_str); 876e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 87747fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton base_time = 0.0 87847fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton last_time = 0.0 87947fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton packet_send_time = 0.0 88047fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton packet_total_times = {} 88177ce90bc96f26ee707ae3ef3ba62099a7c3dc8fdJim Ingham packet_count = {} 88247fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton file = open(file) 88347fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton lines = file.read().splitlines() 884e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton last_command = None 885e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton last_command_args = None 886e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton last_command_packet = None 88747fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton for line in lines: 8881b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton packet_name = None 889e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton m = packet_transmit_name_regex.search(line) 8901b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton is_command = False 891e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if m: 892e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton direction = m.group('direction') 893e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton is_command = direction == 'send' 894e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton packet = m.group('packet') 8951b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton sys.stdout.write(options.colors.green()) 896e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if options.quiet: 897e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if is_command: 898e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print '-->', packet 899e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 900e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print '<--', packet 901e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 902e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print '# ', line 9031b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton sys.stdout.write(options.colors.reset()) 904e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 905e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton #print 'direction = "%s", packet = "%s"' % (direction, packet) 906e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 907e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if packet[0] == '+': 908e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print 'ACK' 909e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton elif packet[0] == '-': 910e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print 'NACK' 911e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton elif packet[0] == '$': 912e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton m = packet_contents_name_regex.match(packet) 913e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if m: 914e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton contents = m.group(1) 915e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if is_command: 916e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton m = packet_names_regex.match (contents) 917e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton if m: 918e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton last_command = m.group(1) 9191b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton packet_name = last_command 920e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton last_command_args = m.group(2) 921e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton last_command_packet = contents 9221b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton gdb_remote_commands[last_command]['cmd'](options, last_command, last_command_args) 923e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 9241b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton packet_match = packet_name_regex.match (line[idx+14:]) 9251b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton if packet_match: 9261b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton packet_name = packet_match.group(1) 9271b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton for tricky_cmd in tricky_commands: 9281b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton if packet_name.find (tricky_cmd) == 0: 9291b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton packet_name = tricky_cmd 9301b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton else: 9311b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton packet_name = contents 932e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton last_command = None 933e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton last_command_args = None 934e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton last_command_packet = None 935e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton elif last_command: 9361b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton gdb_remote_commands[last_command]['rsp'](options, last_command, last_command_args, contents) 937e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 938e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print 'error: invalid packet: "', packet, '"' 939e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 940e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print '???' 941e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton else: 942e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print '## ', line 94347fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton match = timestamp_regex.match (line) 94447fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton if match: 94547fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton curr_time = float (match.group(2)) 94647fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton delta = 0.0 94747fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton if base_time: 94847fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton delta = curr_time - last_time 94947fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton else: 95047fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton base_time = curr_time 9511b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton 9521b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton if is_command: 95347fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton packet_send_time = curr_time 95447fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton elif line.find('read packet: $') >= 0 and packet_name: 95547fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton if packet_name in packet_total_times: 95647fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton packet_total_times[packet_name] += delta 95777ce90bc96f26ee707ae3ef3ba62099a7c3dc8fdJim Ingham packet_count[packet_name] += 1 95847fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton else: 95947fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton packet_total_times[packet_name] = delta 96077ce90bc96f26ee707ae3ef3ba62099a7c3dc8fdJim Ingham packet_count[packet_name] = 1 96147fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton packet_name = None 96247fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton 96347fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton if not options or not options.quiet: 96447fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton print '%s%.6f %+.6f%s' % (match.group(1), curr_time - base_time, delta, match.group(3)) 96547fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton last_time = curr_time 966e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton # else: 967e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton # print line 96847fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton if packet_total_times: 96947fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton total_packet_time = 0.0 97077ce90bc96f26ee707ae3ef3ba62099a7c3dc8fdJim Ingham total_packet_count = 0 97147fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton for key, vvv in packet_total_times.items(): 97247fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton # print ' key = (%s) "%s"' % (type(key), key) 97347fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton # print 'value = (%s) %s' % (type(vvv), vvv) 97447fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton # if type(vvv) == 'float': 97547fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton total_packet_time += vvv 97677ce90bc96f26ee707ae3ef3ba62099a7c3dc8fdJim Ingham for key, vvv in packet_count.items(): 97777ce90bc96f26ee707ae3ef3ba62099a7c3dc8fdJim Ingham total_packet_count += vvv 97877ce90bc96f26ee707ae3ef3ba62099a7c3dc8fdJim Ingham 97977ce90bc96f26ee707ae3ef3ba62099a7c3dc8fdJim Ingham print '#---------------------------------------------------' 98047fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton print '# Packet timing summary:' 98177ce90bc96f26ee707ae3ef3ba62099a7c3dc8fdJim Ingham print '# Totals: time - %6f count %6d' % (total_packet_time, total_packet_count) 98277ce90bc96f26ee707ae3ef3ba62099a7c3dc8fdJim Ingham print '#---------------------------------------------------' 98377ce90bc96f26ee707ae3ef3ba62099a7c3dc8fdJim Ingham print '# Packet Time (sec) Percent Count ' 98477ce90bc96f26ee707ae3ef3ba62099a7c3dc8fdJim Ingham print '#------------------------- ---------- ------- ------' 98577ce90bc96f26ee707ae3ef3ba62099a7c3dc8fdJim Ingham if options and options.sort_count: 98677ce90bc96f26ee707ae3ef3ba62099a7c3dc8fdJim Ingham res = sorted(packet_count, key=packet_count.__getitem__, reverse=True) 98777ce90bc96f26ee707ae3ef3ba62099a7c3dc8fdJim Ingham else: 98877ce90bc96f26ee707ae3ef3ba62099a7c3dc8fdJim Ingham res = sorted(packet_total_times, key=packet_total_times.__getitem__, reverse=True) 98977ce90bc96f26ee707ae3ef3ba62099a7c3dc8fdJim Ingham 99047fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton if last_time > 0.0: 99147fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton for item in res: 99247fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton packet_total_time = packet_total_times[item] 99347fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton packet_percent = (packet_total_time / total_packet_time)*100.0 99447fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton if packet_percent >= 10.0: 99577ce90bc96f26ee707ae3ef3ba62099a7c3dc8fdJim Ingham print " %24s %.6f %.2f%% %6d" % (item, packet_total_time, packet_percent, packet_count[item]) 99647fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton else: 99777ce90bc96f26ee707ae3ef3ba62099a7c3dc8fdJim Ingham print " %24s %.6f %.2f%% %6d" % (item, packet_total_time, packet_percent, packet_count[item]) 99847fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton 99947fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton 100047fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton 100147fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Claytonif __name__ == '__main__': 1002e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton usage = "usage: gdbremote [options]" 1003e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton description='''The command disassembles a GDB remote packet log.''' 1004e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton parser = optparse.OptionParser(description=description, prog='gdbremote',usage=usage) 1005e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton parser.add_option('-v', '--verbose', action='store_true', dest='verbose', help='display verbose debug info', default=False) 1006e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton parser.add_option('-q', '--quiet', action='store_true', dest='quiet', help='display verbose debug info', default=False) 1007e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton parser.add_option('-C', '--color', action='store_true', dest='color', help='add terminal colors', default=False) 1008e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton parser.add_option('-c', '--sort-by-count', action='store_true', dest='sort_count', help='display verbose debug info', default=False) 10091b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton parser.add_option('--crashlog', type='string', dest='crashlog', help='symbolicate using a darwin crash log file', default=False) 1010e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton try: 1011e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton (options, args) = parser.parse_args(sys.argv[1:]) 1012e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton except: 1013e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton print 'error: argument error' 1014e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton sys.exit(1) 1015e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 10161b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton options.colors = TerminalColors(options.color) 10171b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton options.symbolicator = None 10181b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton if options.crashlog: 10191b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton import lldb 10201b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton lldb.debugger = lldb.SBDebugger.Create() 10211b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton import lldb.macosx.crashlog 10221b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton options.symbolicator = lldb.macosx.crashlog.CrashLog(options.crashlog) 10231b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton print '%s' % (options.symbolicator) 1024e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton 102547fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton # This script is being run from the command line, create a debugger in case we are 102647fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton # going to use any debugger functions in our function. 1027e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton for file in args: 102847fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton print '#----------------------------------------------------------------------' 102947fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton print "# GDB remote log file: '%s'" % file 103047fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton print '#----------------------------------------------------------------------' 1031e828693c2c5d82455d82cc9ba4b2e0a1efabe84aGreg Clayton parse_gdb_log_file (file, options) 10321b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton if options.symbolicator: 10331b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton print '%s' % (options.symbolicator) 10341b62f5967aa04ebde2ae163f12c739a6740596e2Greg Clayton 103547fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Claytonelse: 103647fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton import lldb 103747fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton if lldb.debugger: 103847fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton # This initializer is being run from LLDB in the embedded command interpreter 103947fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton # Add any commands contained in this module to LLDB 104047fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton lldb.debugger.HandleCommand('command script add -f gdbremote.start_gdb_log start_gdb_log') 104147fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton lldb.debugger.HandleCommand('command script add -f gdbremote.stop_gdb_log stop_gdb_log') 104247fdb0f9cc01d79ed15cb8c80ea5c4c2f381490dGreg Clayton print 'The "start_gdb_log" and "stop_gdb_log" commands are now installed and ready for use, type "start_gdb_log --help" or "stop_gdb_log --help" for more information' 1043