#!/usr/bin/env python

# ----------------------------------------------------------------------
# This module will enable GDB remote packet logging when the
# 'start_gdb_log' command is called with a filename to log to. When the
# 'stop_gdb_log' command is called, it will disable the logging and
# print out statistics about how long commands took to execute and also
# will primnt ou
# Be sure to add the python path that points to the LLDB shared library.
#
# To use this in the embedded python interpreter using "lldb" just
# import it with the full path using the "command script import"
# command. This can be done from the LLDB command line:
#   (lldb) command script import /path/to/gdbremote.py
# Or it can be added to your ~/.lldbinit file so this module is always
# available.
# ----------------------------------------------------------------------

import binascii
import subprocess
import json
import math
import optparse
import os
import re
import shlex
import string
import sys
import tempfile
import xml.etree.ElementTree as ET

# ----------------------------------------------------------------------
# Global variables
# ----------------------------------------------------------------------
g_log_file = ""
g_byte_order = "little"
g_number_regex = re.compile("^(0x[0-9a-fA-F]+|[0-9]+)")
g_thread_id_regex = re.compile("^(-1|[0-9a-fA-F]+|0)")


class TerminalColors:
    """Simple terminal colors class"""

    def __init__(self, enabled=True):
        # TODO: discover terminal type from "file" and disable if
        # it can't handle the color codes
        self.enabled = enabled

    def reset(self):
        """Reset all terminal colors and formatting."""
        if self.enabled:
            return "\x1b[0m"
        return ""

    def bold(self, on=True):
        """Enable or disable bold depending on the "on" parameter."""
        if self.enabled:
            if on:
                return "\x1b[1m"
            else:
                return "\x1b[22m"
        return ""

    def italics(self, on=True):
        """Enable or disable italics depending on the "on" parameter."""
        if self.enabled:
            if on:
                return "\x1b[3m"
            else:
                return "\x1b[23m"
        return ""

    def underline(self, on=True):
        """Enable or disable underline depending on the "on" parameter."""
        if self.enabled:
            if on:
                return "\x1b[4m"
            else:
                return "\x1b[24m"
        return ""

    def inverse(self, on=True):
        """Enable or disable inverse depending on the "on" parameter."""
        if self.enabled:
            if on:
                return "\x1b[7m"
            else:
                return "\x1b[27m"
        return ""

    def strike(self, on=True):
        """Enable or disable strike through depending on the "on" parameter."""
        if self.enabled:
            if on:
                return "\x1b[9m"
            else:
                return "\x1b[29m"
        return ""

    def black(self, fg=True):
        """Set the foreground or background color to black.
        The foreground color will be set if "fg" tests True. The background color will be set if "fg" tests False.
        """
        if self.enabled:
            if fg:
                return "\x1b[30m"
            else:
                return "\x1b[40m"
        return ""

    def red(self, fg=True):
        """Set the foreground or background color to red.
        The foreground color will be set if "fg" tests True. The background color will be set if "fg" tests False.
        """
        if self.enabled:
            if fg:
                return "\x1b[31m"
            else:
                return "\x1b[41m"
        return ""

    def green(self, fg=True):
        """Set the foreground or background color to green.
        The foreground color will be set if "fg" tests True. The background color will be set if "fg" tests False.
        """
        if self.enabled:
            if fg:
                return "\x1b[32m"
            else:
                return "\x1b[42m"
        return ""

    def yellow(self, fg=True):
        """Set the foreground or background color to yellow.
        The foreground color will be set if "fg" tests True. The background color will be set if "fg" tests False.
        """
        if self.enabled:
            if fg:
                return "\x1b[33m"
            else:
                return "\x1b[43m"
        return ""

    def blue(self, fg=True):
        """Set the foreground or background color to blue.
        The foreground color will be set if "fg" tests True. The background color will be set if "fg" tests False.
        """
        if self.enabled:
            if fg:
                return "\x1b[34m"
            else:
                return "\x1b[44m"
        return ""

    def magenta(self, fg=True):
        """Set the foreground or background color to magenta.
        The foreground color will be set if "fg" tests True. The background color will be set if "fg" tests False.
        """
        if self.enabled:
            if fg:
                return "\x1b[35m"
            else:
                return "\x1b[45m"
        return ""

    def cyan(self, fg=True):
        """Set the foreground or background color to cyan.
        The foreground color will be set if "fg" tests True. The background color will be set if "fg" tests False.
        """
        if self.enabled:
            if fg:
                return "\x1b[36m"
            else:
                return "\x1b[46m"
        return ""

    def white(self, fg=True):
        """Set the foreground or background color to white.
        The foreground color will be set if "fg" tests True. The background color will be set if "fg" tests False.
        """
        if self.enabled:
            if fg:
                return "\x1b[37m"
            else:
                return "\x1b[47m"
        return ""

    def default(self, fg=True):
        """Set the foreground or background color to the default.
        The foreground color will be set if "fg" tests True. The background color will be set if "fg" tests False.
        """
        if self.enabled:
            if fg:
                return "\x1b[39m"
            else:
                return "\x1b[49m"
        return ""


def start_gdb_log(debugger, command, result, dict):
    """Start logging GDB remote packets by enabling logging with timestamps and
    thread safe logging. Follow a call to this function with a call to "stop_gdb_log"
    in order to dump out the commands."""
    global g_log_file
    command_args = shlex.split(command)
    usage = "usage: start_gdb_log [options] [<LOGFILEPATH>]"
    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
    be aggregated and displayed."""
    parser = optparse.OptionParser(
        description=description, prog="start_gdb_log", usage=usage
    )
    parser.add_option(
        "-v",
        "--verbose",
        action="store_true",
        dest="verbose",
        help="display verbose debug info",
        default=False,
    )
    try:
        (options, args) = parser.parse_args(command_args)
    except:
        return

    if g_log_file:
        result.PutCString(
            'error: logging is already in progress with file "%s"' % g_log_file
        )
    else:
        args_len = len(args)
        if args_len == 0:
            g_log_file = tempfile.mktemp()
        elif len(args) == 1:
            g_log_file = args[0]

        if g_log_file:
            debugger.HandleCommand(
                'log enable --threadsafe --timestamp --file "%s" gdb-remote packets'
                % g_log_file
            )
            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
            )
            return

        result.PutCString("error: invalid log file path")
    result.PutCString(usage)


def stop_gdb_log(debugger, command, result, dict):
    """Stop logging GDB remote packets to the file that was specified in a call
    to "start_gdb_log" and normalize the timestamps to be relative to the first
    timestamp in the log file. Also print out statistics for how long each
    command took to allow performance bottlenecks to be determined."""
    global g_log_file
    # Any commands whose names might be followed by more valid C identifier
    # characters must be listed here
    command_args = shlex.split(command)
    usage = "usage: stop_gdb_log [options]"
    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."""
    parser = optparse.OptionParser(
        description=description, prog="stop_gdb_log", usage=usage
    )
    parser.add_option(
        "-v",
        "--verbose",
        action="store_true",
        dest="verbose",
        help="display verbose debug info",
        default=False,
    )
    parser.add_option(
        "--plot",
        action="store_true",
        dest="plot",
        help="plot packet latencies by packet type",
        default=False,
    )
    parser.add_option(
        "-q",
        "--quiet",
        action="store_true",
        dest="quiet",
        help="display verbose debug info",
        default=False,
    )
    parser.add_option(
        "-C",
        "--color",
        action="store_true",
        dest="color",
        help="add terminal colors",
        default=False,
    )
    parser.add_option(
        "-c",
        "--sort-by-count",
        action="store_true",
        dest="sort_count",
        help="display verbose debug info",
        default=False,
    )
    parser.add_option(
        "-s",
        "--symbolicate",
        action="store_true",
        dest="symbolicate",
        help='symbolicate addresses in log using current "lldb.target"',
        default=False,
    )
    try:
        (options, args) = parser.parse_args(command_args)
    except:
        return
    options.colors = TerminalColors(options.color)
    options.symbolicator = None
    if options.symbolicate:
        if lldb.target:
            import lldb.utils.symbolication

            options.symbolicator = lldb.utils.symbolication.Symbolicator()
            options.symbolicator.target = lldb.target
        else:
            print("error: can't symbolicate without a target")

    if not g_log_file:
        result.PutCString(
            'error: logging must have been previously enabled with a call to "stop_gdb_log"'
        )
    elif os.path.exists(g_log_file):
        if len(args) == 0:
            debugger.HandleCommand("log disable gdb-remote packets")
            result.PutCString(
                "GDB packet logging disabled. Logged packets are in '%s'" % g_log_file
            )
            parse_gdb_log_file(g_log_file, options)
        else:
            result.PutCString(usage)
    else:
        print('error: the GDB packet log file "%s" does not exist' % g_log_file)


def is_hex_byte(str):
    if len(str) == 2:
        return str[0] in string.hexdigits and str[1] in string.hexdigits
    return False


def get_hex_string_if_all_printable(str):
    try:
        s = binascii.unhexlify(str).decode()
        if all(c in string.printable for c in s):
            return s
    except (TypeError, binascii.Error, UnicodeDecodeError):
        pass
    return None


# global register info list
g_register_infos = list()
g_max_register_info_name_len = 0


class RegisterInfo:
    """Class that represents register information"""

    def __init__(self, kvp):
        self.info = dict()
        for kv in kvp:
            key = kv[0]
            value = kv[1]
            self.info[key] = value

    def name(self):
        """Get the name of the register."""
        if self.info and "name" in self.info:
            return self.info["name"]
        return None

    def bit_size(self):
        """Get the size in bits of the register."""
        if self.info and "bitsize" in self.info:
            return int(self.info["bitsize"])
        return 0

    def byte_size(self):
        """Get the size in bytes of the register."""
        return self.bit_size() / 8

    def get_value_from_hex_string(self, hex_str):
        """Dump the register value given a native byte order encoded hex ASCII byte string."""
        encoding = self.info["encoding"]
        bit_size = self.bit_size()
        packet = Packet(hex_str)
        if encoding == "uint":
            uval = packet.get_hex_uint(g_byte_order)
            if bit_size == 8:
                return "0x%2.2x" % (uval)
            elif bit_size == 16:
                return "0x%4.4x" % (uval)
            elif bit_size == 32:
                return "0x%8.8x" % (uval)
            elif bit_size == 64:
                return "0x%16.16x" % (uval)
        bytes = list()
        uval = packet.get_hex_uint8()
        while uval is not None:
            bytes.append(uval)
            uval = packet.get_hex_uint8()
        value_str = "0x"
        if g_byte_order == "little":
            bytes.reverse()
        for byte in bytes:
            value_str += "%2.2x" % byte
        return "%s" % (value_str)

    def __str__(self):
        """Dump the register info key/value pairs"""
        s = ""
        for key in self.info.keys():
            if s:
                s += ", "
            s += "%s=%s " % (key, self.info[key])
        return s


class Packet:
    """Class that represents a packet that contains string data"""

    def __init__(self, packet_str):
        self.str = packet_str

    def peek_char(self):
        ch = 0
        if self.str:
            ch = self.str[0]
        return ch

    def get_char(self):
        ch = 0
        if self.str:
            ch = self.str[0]
            self.str = self.str[1:]
        return ch

    def skip_exact_string(self, s):
        if self.str and self.str.startswith(s):
            self.str = self.str[len(s) :]
            return True
        else:
            return False

    def get_thread_id(self, fail_value=-1):
        match = g_number_regex.match(self.str)
        if match:
            number_str = match.group(1)
            self.str = self.str[len(number_str) :]
            return int(number_str, 0)
        else:
            return fail_value

    def get_hex_uint8(self):
        if (
            self.str
            and len(self.str) >= 2
            and self.str[0] in string.hexdigits
            and self.str[1] in string.hexdigits
        ):
            uval = int(self.str[0:2], 16)
            self.str = self.str[2:]
            return uval
        return None

    def get_hex_uint16(self, byte_order):
        uval = 0
        if byte_order == "big":
            uval |= self.get_hex_uint8() << 8
            uval |= self.get_hex_uint8()
        else:
            uval |= self.get_hex_uint8()
            uval |= self.get_hex_uint8() << 8
        return uval

    def get_hex_uint32(self, byte_order):
        uval = 0
        if byte_order == "big":
            uval |= self.get_hex_uint8() << 24
            uval |= self.get_hex_uint8() << 16
            uval |= self.get_hex_uint8() << 8
            uval |= self.get_hex_uint8()
        else:
            uval |= self.get_hex_uint8()
            uval |= self.get_hex_uint8() << 8
            uval |= self.get_hex_uint8() << 16
            uval |= self.get_hex_uint8() << 24
        return uval

    def get_hex_uint64(self, byte_order):
        uval = 0
        if byte_order == "big":
            uval |= self.get_hex_uint8() << 56
            uval |= self.get_hex_uint8() << 48
            uval |= self.get_hex_uint8() << 40
            uval |= self.get_hex_uint8() << 32
            uval |= self.get_hex_uint8() << 24
            uval |= self.get_hex_uint8() << 16
            uval |= self.get_hex_uint8() << 8
            uval |= self.get_hex_uint8()
        else:
            uval |= self.get_hex_uint8()
            uval |= self.get_hex_uint8() << 8
            uval |= self.get_hex_uint8() << 16
            uval |= self.get_hex_uint8() << 24
            uval |= self.get_hex_uint8() << 32
            uval |= self.get_hex_uint8() << 40
            uval |= self.get_hex_uint8() << 48
            uval |= self.get_hex_uint8() << 56
        return uval

    def get_number(self, fail_value=-1):
        """Get a number from the packet. The number must be in big endian format and should be parsed
        according to its prefix (starts with "0x" means hex, starts with "0" means octal, starts with
        [1-9] means decimal, etc)"""
        match = g_number_regex.match(self.str)
        if match:
            number_str = match.group(1)
            self.str = self.str[len(number_str) :]
            return int(number_str, 0)
        else:
            return fail_value

    def get_hex_ascii_str(self, n=0):
        hex_chars = self.get_hex_chars(n)
        if hex_chars:
            return binascii.unhexlify(hex_chars)
        else:
            return None

    def get_hex_chars(self, n=0):
        str_len = len(self.str)
        if n == 0:
            # n was zero, so we need to determine all hex chars and
            # stop when we hit the end of the string of a non-hex character
            while n < str_len and self.str[n] in string.hexdigits:
                n = n + 1
        else:
            if n > str_len:
                return None  # Not enough chars
            # Verify all chars are hex if a length was specified
            for i in range(n):
                if self.str[i] not in string.hexdigits:
                    return None  # Not all hex digits
        if n == 0:
            return None
        hex_str = self.str[0:n]
        self.str = self.str[n:]
        return hex_str

    def get_hex_uint(self, byte_order, n=0):
        if byte_order == "big":
            hex_str = self.get_hex_chars(n)
            if hex_str is None:
                return None
            return int(hex_str, 16)
        else:
            uval = self.get_hex_uint8()
            if uval is None:
                return None
            uval_result = 0
            shift = 0
            while uval is not None:
                uval_result |= uval << shift
                shift += 8
                uval = self.get_hex_uint8()
            return uval_result

    def get_key_value_pairs(self):
        kvp = list()
        if ";" in self.str:
            key_value_pairs = self.str.split(";")
            for key_value_pair in key_value_pairs:
                if len(key_value_pair):
                    kvp.append(key_value_pair.split(":", 1))
        return kvp

    def split(self, ch):
        return self.str.split(ch)

    def split_hex(self, ch, byte_order):
        hex_values = list()
        strings = self.str.split(ch)
        for str in strings:
            hex_values.append(Packet(str).get_hex_uint(byte_order))
        return hex_values

    def __str__(self):
        return self.str

    def __len__(self):
        return len(self.str)


g_thread_suffix_regex = re.compile(";thread:([0-9a-fA-F]+);")


def get_thread_from_thread_suffix(str):
    if str:
        match = g_thread_suffix_regex.match(str)
        if match:
            return int(match.group(1), 16)
    return None


def cmd_qThreadStopInfo(options, cmd, args):
    packet = Packet(args)
    tid = packet.get_hex_uint("big")
    print("get_thread_stop_info  (tid = 0x%x)" % (tid))


def cmd_stop_reply(options, cmd, args):
    print("get_last_stop_info()")
    return False


def rsp_stop_reply(options, cmd, cmd_args, rsp):
    global g_byte_order
    packet = Packet(rsp)
    stop_type = packet.get_char()
    if stop_type == "T" or stop_type == "S":
        signo = packet.get_hex_uint8()
        key_value_pairs = packet.get_key_value_pairs()
        for key_value_pair in key_value_pairs:
            key = key_value_pair[0]
            if is_hex_byte(key):
                reg_num = Packet(key).get_hex_uint8()
                if reg_num < len(g_register_infos):
                    reg_info = g_register_infos[reg_num]
                    key_value_pair[0] = reg_info.name()
                    key_value_pair[1] = reg_info.get_value_from_hex_string(
                        key_value_pair[1]
                    )
            elif key == "jthreads" or key == "jstopinfo":
                key_value_pair[1] = binascii.unhexlify(key_value_pair[1])
        key_value_pairs.insert(0, ["signal", signo])
        print("stop_reply():")
        dump_key_value_pairs(key_value_pairs)
    elif stop_type == "W":
        exit_status = packet.get_hex_uint8()
        print("stop_reply(): exit (status=%i)" % exit_status)
    elif stop_type == "O":
        print('stop_reply(): stdout = "%s"' % packet.str)


def cmd_unknown_packet(options, cmd, args):
    if args:
        print("cmd: %s, args: %s", cmd, args)
    else:
        print("cmd: %s", cmd)
    return False


def cmd_qSymbol(options, cmd, args):
    if args == ":":
        print("ready to serve symbols")
    else:
        packet = Packet(args)
        symbol_addr = packet.get_hex_uint("big")
        if symbol_addr is None:
            if packet.skip_exact_string(":"):
                symbol_name = packet.get_hex_ascii_str()
                print('lookup_symbol("%s") -> symbol not available yet' % (symbol_name))
            else:
                print("error: bad command format")
        else:
            if packet.skip_exact_string(":"):
                symbol_name = packet.get_hex_ascii_str()
                print('lookup_symbol("%s") -> 0x%x' % (symbol_name, symbol_addr))
            else:
                print("error: bad command format")


def cmd_QSetWithHexString(options, cmd, args):
    print('%s("%s")' % (cmd[:-1], binascii.unhexlify(args)))


def cmd_QSetWithString(options, cmd, args):
    print('%s("%s")' % (cmd[:-1], args))


def cmd_QSetWithUnsigned(options, cmd, args):
    print("%s(%i)" % (cmd[:-1], int(args)))


def rsp_qSymbol(options, cmd, cmd_args, rsp):
    if len(rsp) == 0:
        print("Unsupported")
    else:
        if rsp == "OK":
            print("No more symbols to lookup")
        else:
            packet = Packet(rsp)
            if packet.skip_exact_string("qSymbol:"):
                symbol_name = packet.get_hex_ascii_str()
                print('lookup_symbol("%s")' % (symbol_name))
            else:
                print(
                    'error: response string should start with "qSymbol:": respnse is "%s"'
                    % (rsp)
                )


def cmd_qXfer(options, cmd, args):
    # $qXfer:features:read:target.xml:0,1ffff#14
    print("read target special data %s" % (args))
    return True


def rsp_qXfer(options, cmd, cmd_args, rsp):
    data = cmd_args.split(":")
    if data[0] == "features":
        if data[1] == "read":
            filename, extension = os.path.splitext(data[2])
            if extension == ".xml":
                response = Packet(rsp)
                xml_string = response.get_hex_ascii_str()
                if xml_string:
                    ch = xml_string[0]
                    if ch == "l":
                        xml_string = xml_string[1:]
                        xml_root = ET.fromstring(xml_string)
                        for reg_element in xml_root.findall("./feature/reg"):
                            if not "value_regnums" in reg_element.attrib:
                                reg_info = RegisterInfo([])
                                if "name" in reg_element.attrib:
                                    reg_info.info["name"] = reg_element.attrib["name"]
                                else:
                                    reg_info.info["name"] = "unspecified"
                                if "encoding" in reg_element.attrib:
                                    reg_info.info["encoding"] = reg_element.attrib[
                                        "encoding"
                                    ]
                                else:
                                    reg_info.info["encoding"] = "uint"
                                if "offset" in reg_element.attrib:
                                    reg_info.info["offset"] = reg_element.attrib[
                                        "offset"
                                    ]
                                if "bitsize" in reg_element.attrib:
                                    reg_info.info["bitsize"] = reg_element.attrib[
                                        "bitsize"
                                    ]
                                g_register_infos.append(reg_info)
                        print('XML for "%s":' % (data[2]))
                        ET.dump(xml_root)


def cmd_A(options, cmd, args):
    print("launch process:")
    packet = Packet(args)
    while True:
        arg_len = packet.get_number()
        if arg_len == -1:
            break
        if not packet.skip_exact_string(","):
            break
        arg_idx = packet.get_number()
        if arg_idx == -1:
            break
        if not packet.skip_exact_string(","):
            break
        arg_value = packet.get_hex_ascii_str(arg_len)
        print('argv[%u] = "%s"' % (arg_idx, arg_value))


def cmd_qC(options, cmd, args):
    print("query_current_thread_id()")


def rsp_qC(options, cmd, cmd_args, rsp):
    packet = Packet(rsp)
    if packet.skip_exact_string("QC"):
        tid = packet.get_thread_id()
        print("current_thread_id = %#x" % (tid))
    else:
        print("current_thread_id = old thread ID")


def cmd_query_packet(options, cmd, args):
    if args:
        print("%s%s" % (cmd, args))
    else:
        print("%s" % (cmd))
    return False


def rsp_ok_error(rsp):
    print("rsp: ", rsp)


def rsp_ok_means_supported(options, cmd, cmd_args, rsp):
    if rsp == "OK":
        print("%s%s is supported" % (cmd, cmd_args))
    elif rsp == "":
        print("%s%s is not supported" % (cmd, cmd_args))
    else:
        print("%s%s -> %s" % (cmd, cmd_args, rsp))


def rsp_ok_means_success(options, cmd, cmd_args, rsp):
    if rsp == "OK":
        print("success")
    elif rsp == "":
        print("%s%s is not supported" % (cmd, cmd_args))
    else:
        print("%s%s -> %s" % (cmd, cmd_args, rsp))


def dump_key_value_pairs(key_value_pairs):
    max_key_len = 0
    for key_value_pair in key_value_pairs:
        key_len = len(key_value_pair[0])
        if max_key_len < key_len:
            max_key_len = key_len
    for key_value_pair in key_value_pairs:
        key = key_value_pair[0]
        value = key_value_pair[1]
        unhex_value = get_hex_string_if_all_printable(value)
        if unhex_value:
            print("%*s = %s (%s)" % (max_key_len, key, value, unhex_value))
        else:
            print("%*s = %s" % (max_key_len, key, value))


def rsp_dump_key_value_pairs(options, cmd, cmd_args, rsp):
    if rsp:
        print("%s response:" % (cmd))
        packet = Packet(rsp)
        key_value_pairs = packet.get_key_value_pairs()
        dump_key_value_pairs(key_value_pairs)
    else:
        print("not supported")


def cmd_c(options, cmd, args):
    print("continue()")
    return False


def cmd_s(options, cmd, args):
    print("step()")
    return False


def cmd_qSpeedTest(options, cmd, args):
    print(("qSpeedTest: cmd='%s', args='%s'" % (cmd, args)))


def rsp_qSpeedTest(options, cmd, cmd_args, rsp):
    print(("qSpeedTest: rsp='%s' cmd='%s', args='%s'" % (rsp, cmd, args)))


def cmd_vCont(options, cmd, args):
    if args == "?":
        print("%s: get supported extended continue modes" % (cmd))
    else:
        got_other_threads = 0
        s = ""
        for thread_action in args[1:].split(";"):
            (short_action, thread) = thread_action.split(":", 1)
            tid = int(thread, 16)
            if short_action == "c":
                action = "continue"
            elif short_action == "s":
                action = "step"
            elif short_action[0] == "C":
                action = "continue with signal 0x%s" % (short_action[1:])
            elif short_action == "S":
                action = "step with signal 0x%s" % (short_action[1:])
            else:
                action = short_action
            if s:
                s += ", "
            if tid == -1:
                got_other_threads = 1
                s += "other-threads:"
            else:
                s += "thread 0x%4.4x: %s" % (tid, action)
        if got_other_threads:
            print("extended_continue (%s)" % (s))
        else:
            print("extended_continue (%s, other-threads: suspend)" % (s))
    return False


def rsp_vCont(options, cmd, cmd_args, rsp):
    if cmd_args == "?":
        # Skip the leading 'vCont;'
        rsp = rsp[6:]
        modes = rsp.split(";")
        s = "%s: supported extended continue modes include: " % (cmd)

        for i, mode in enumerate(modes):
            if i:
                s += ", "
            if mode == "c":
                s += "continue"
            elif mode == "C":
                s += "continue with signal"
            elif mode == "s":
                s += "step"
            elif mode == "S":
                s += "step with signal"
            elif mode == "t":
                s += "stop"
            # else:
            #     s += 'unrecognized vCont mode: ', str(mode)
        print(s)
    elif rsp:
        if rsp[0] == "T" or rsp[0] == "S" or rsp[0] == "W" or rsp[0] == "X":
            rsp_stop_reply(options, cmd, cmd_args, rsp)
            return
        if rsp[0] == "O":
            print("stdout: %s" % (rsp))
            return
    else:
        print(
            "not supported (cmd = '%s', args = '%s', rsp = '%s')" % (cmd, cmd_args, rsp)
        )


def cmd_vAttach(options, cmd, args):
    (extra_command, args) = args.split(";")
    if extra_command:
        print("%s%s(%s)" % (cmd, extra_command, args))
    else:
        print("attach(pid = %u)" % int(args, 16))
    return False


def cmd_qRegisterInfo(options, cmd, args):
    print("query_register_info(reg_num=%i)" % (int(args, 16)))
    return False


def rsp_qRegisterInfo(options, cmd, cmd_args, rsp):
    global g_max_register_info_name_len
    print("query_register_info(reg_num=%i):" % (int(cmd_args, 16)), end=" ")
    if len(rsp) == 3 and rsp[0] == "E":
        g_max_register_info_name_len = 0
        for reg_info in g_register_infos:
            name_len = len(reg_info.name())
            if g_max_register_info_name_len < name_len:
                g_max_register_info_name_len = name_len
        print(" DONE")
    else:
        packet = Packet(rsp)
        reg_info = RegisterInfo(packet.get_key_value_pairs())
        g_register_infos.append(reg_info)
        print(reg_info)
    return False


def cmd_qThreadInfo(options, cmd, args):
    if cmd == "qfThreadInfo":
        query_type = "first"
    else:
        query_type = "subsequent"
    print("get_current_thread_list(type=%s)" % (query_type))
    return False


def rsp_qThreadInfo(options, cmd, cmd_args, rsp):
    packet = Packet(rsp)
    response_type = packet.get_char()
    if response_type == "m":
        tids = packet.split_hex(";", "big")
        for i, tid in enumerate(tids):
            if i:
                print(",", end=" ")
            print("0x%x" % (tid), end=" ")
        print()
    elif response_type == "l":
        print("END")


def rsp_hex_big_endian(options, cmd, cmd_args, rsp):
    if rsp == "":
        print("%s%s is not supported" % (cmd, cmd_args))
    else:
        packet = Packet(rsp)
        uval = packet.get_hex_uint("big")
        print("%s: 0x%x" % (cmd, uval))


def cmd_read_mem_bin(options, cmd, args):
    # x0x7fff5fc39200,0x200
    packet = Packet(args)
    addr = packet.get_hex_uint("big")
    comma = packet.get_char()
    size = packet.get_hex_uint("big")
    print("binary_read_memory (addr = 0x%16.16x, size = %u)" % (addr, size))
    return False


def rsp_mem_bin_bytes(options, cmd, cmd_args, rsp):
    packet = Packet(cmd_args)
    addr = packet.get_hex_uint("big")
    comma = packet.get_char()
    size = packet.get_hex_uint("big")
    print("memory:")
    if size > 0:
        dump_hex_memory_buffer(addr, rsp)


def cmd_read_memory(options, cmd, args):
    packet = Packet(args)
    addr = packet.get_hex_uint("big")
    comma = packet.get_char()
    size = packet.get_hex_uint("big")
    print("read_memory (addr = 0x%16.16x, size = %u)" % (addr, size))
    return False


def dump_hex_memory_buffer(addr, hex_byte_str):
    packet = Packet(hex_byte_str)
    idx = 0
    ascii = ""
    uval = packet.get_hex_uint8()
    while uval is not None:
        if (idx % 16) == 0:
            if ascii:
                print("  ", ascii)
                ascii = ""
            print("0x%x:" % (addr + idx), end=" ")
        print("%2.2x" % (uval), end=" ")
        if 0x20 <= uval and uval < 0x7F:
            ascii += "%c" % uval
        else:
            ascii += "."
        uval = packet.get_hex_uint8()
        idx = idx + 1
    if ascii:
        print("  ", ascii)
        ascii = ""


def cmd_write_memory(options, cmd, args):
    packet = Packet(args)
    addr = packet.get_hex_uint("big")
    if packet.get_char() != ",":
        print("error: invalid write memory command (missing comma after address)")
        return
    size = packet.get_hex_uint("big")
    if packet.get_char() != ":":
        print("error: invalid write memory command (missing colon after size)")
        return
    print("write_memory (addr = 0x%16.16x, size = %u, data:" % (addr, size))
    dump_hex_memory_buffer(addr, packet.str)
    return False


def cmd_alloc_memory(options, cmd, args):
    packet = Packet(args)
    byte_size = packet.get_hex_uint("big")
    if packet.get_char() != ",":
        print("error: invalid allocate memory command (missing comma after address)")
        return
    print(
        "allocate_memory (byte-size = %u (0x%x), permissions = %s)"
        % (byte_size, byte_size, packet.str)
    )
    return False


def rsp_alloc_memory(options, cmd, cmd_args, rsp):
    packet = Packet(rsp)
    addr = packet.get_hex_uint("big")
    print("addr = 0x%x" % addr)


def cmd_dealloc_memory(options, cmd, args):
    packet = Packet(args)
    addr = packet.get_hex_uint("big")
    if packet.get_char() != ",":
        print("error: invalid allocate memory command (missing comma after address)")
    else:
        print("deallocate_memory (addr = 0x%x, permissions = %s)" % (addr, packet.str))
    return False


def rsp_memory_bytes(options, cmd, cmd_args, rsp):
    addr = Packet(cmd_args).get_hex_uint("big")
    dump_hex_memory_buffer(addr, rsp)


def get_register_name_equal_value(options, reg_num, hex_value_str):
    if reg_num < len(g_register_infos):
        reg_info = g_register_infos[reg_num]
        value_str = reg_info.get_value_from_hex_string(hex_value_str)
        s = reg_info.name() + " = "
        if options.symbolicator:
            symbolicated_addresses = options.symbolicator.symbolicate(int(value_str, 0))
            if symbolicated_addresses:
                s += options.colors.magenta()
                s += "%s" % symbolicated_addresses[0]
                s += options.colors.reset()
                return s
        s += value_str
        return s
    else:
        reg_value = Packet(hex_value_str).get_hex_uint(g_byte_order)
        return "reg(%u) = 0x%x" % (reg_num, reg_value)


def cmd_read_one_reg(options, cmd, args):
    packet = Packet(args)
    reg_num = packet.get_hex_uint("big")
    tid = get_thread_from_thread_suffix(packet.str)
    name = None
    if reg_num < len(g_register_infos):
        name = g_register_infos[reg_num].name()
    if packet.str:
        packet.get_char()  # skip ;
        thread_info = packet.get_key_value_pairs()
        tid = int(thread_info[0][1], 16)
    s = "read_register (reg_num=%u" % reg_num
    if name:
        s += " (%s)" % (name)
    if tid is not None:
        s += ", tid = 0x%4.4x" % (tid)
    s += ")"
    print(s)
    return False


def rsp_read_one_reg(options, cmd, cmd_args, rsp):
    packet = Packet(cmd_args)
    reg_num = packet.get_hex_uint("big")
    print(get_register_name_equal_value(options, reg_num, rsp))


def cmd_write_one_reg(options, cmd, args):
    packet = Packet(args)
    reg_num = packet.get_hex_uint("big")
    if packet.get_char() != "=":
        print("error: invalid register write packet")
    else:
        name = None
        hex_value_str = packet.get_hex_chars()
        tid = get_thread_from_thread_suffix(packet.str)
        s = "write_register (reg_num=%u" % reg_num
        if name:
            s += " (%s)" % (name)
        s += ", value = "
        s += get_register_name_equal_value(options, reg_num, hex_value_str)
        if tid is not None:
            s += ", tid = 0x%4.4x" % (tid)
        s += ")"
        print(s)
    return False


def dump_all_regs(packet):
    for reg_info in g_register_infos:
        nibble_size = reg_info.bit_size() / 4
        hex_value_str = packet.get_hex_chars(nibble_size)
        if hex_value_str is not None:
            value = reg_info.get_value_from_hex_string(hex_value_str)
            print("%*s = %s" % (g_max_register_info_name_len, reg_info.name(), value))
        else:
            return


def cmd_read_all_regs(cmd, cmd_args):
    packet = Packet(cmd_args)
    packet.get_char()  # toss the 'g' command character
    tid = get_thread_from_thread_suffix(packet.str)
    if tid is not None:
        print("read_all_register(thread = 0x%4.4x)" % tid)
    else:
        print("read_all_register()")
    return False


def rsp_read_all_regs(options, cmd, cmd_args, rsp):
    packet = Packet(rsp)
    dump_all_regs(packet)


def cmd_write_all_regs(options, cmd, args):
    packet = Packet(args)
    print("write_all_registers()")
    dump_all_regs(packet)
    return False


g_bp_types = ["software_bp", "hardware_bp", "write_wp", "read_wp", "access_wp"]


def cmd_bp(options, cmd, args):
    if cmd == "Z":
        s = "set_"
    else:
        s = "clear_"
    packet = Packet(args)
    bp_type = packet.get_hex_uint("big")
    packet.get_char()  # Skip ,
    bp_addr = packet.get_hex_uint("big")
    packet.get_char()  # Skip ,
    bp_size = packet.get_hex_uint("big")
    s += g_bp_types[bp_type]
    s += " (addr = 0x%x, size = %u)" % (bp_addr, bp_size)
    print(s)
    return False


def cmd_mem_rgn_info(options, cmd, args):
    packet = Packet(args)
    packet.get_char()  # skip ':' character
    addr = packet.get_hex_uint("big")
    print("get_memory_region_info (addr=0x%x)" % (addr))
    return False


def cmd_kill(options, cmd, args):
    print("kill_process()")
    return False


def cmd_jThreadsInfo(options, cmd, args):
    print("jThreadsInfo()")
    return False


def cmd_jGetLoadedDynamicLibrariesInfos(options, cmd, args):
    print("jGetLoadedDynamicLibrariesInfos()")
    return False


def decode_packet(s, start_index=0):
    # print '\ndecode_packet("%s")' % (s[start_index:])
    index = s.find("}", start_index)
    have_escapes = index != -1
    if have_escapes:
        normal_s = s[start_index:index]
    else:
        normal_s = s[start_index:]
    # print 'normal_s = "%s"' % (normal_s)
    if have_escapes:
        escape_char = "%c" % (ord(s[index + 1]) ^ 0x20)
        # print 'escape_char for "%s" = %c' % (s[index:index+2], escape_char)
        return normal_s + escape_char + decode_packet(s, index + 2)
    else:
        return normal_s


def rsp_json(options, cmd, cmd_args, rsp):
    print("%s() reply:" % (cmd))
    if not rsp:
        return
    try:
        json_tree = json.loads(rsp)
        print(json.dumps(json_tree, indent=4, separators=(",", ": ")))
    except json.JSONDecodeError:
        return


def rsp_jGetLoadedDynamicLibrariesInfos(options, cmd, cmd_args, rsp):
    if cmd_args:
        rsp_json(options, cmd, cmd_args, rsp)
    else:
        rsp_ok_means_supported(options, cmd, cmd_args, rsp)


gdb_remote_commands = {
    "\\?": {"cmd": cmd_stop_reply, "rsp": rsp_stop_reply, "name": "stop reply pacpket"},
    "qThreadStopInfo": {
        "cmd": cmd_qThreadStopInfo,
        "rsp": rsp_stop_reply,
        "name": "stop reply pacpket",
    },
    "QStartNoAckMode": {
        "cmd": cmd_query_packet,
        "rsp": rsp_ok_means_supported,
        "name": "query if no ack mode is supported",
    },
    "QThreadSuffixSupported": {
        "cmd": cmd_query_packet,
        "rsp": rsp_ok_means_supported,
        "name": "query if thread suffix is supported",
    },
    "QListThreadsInStopReply": {
        "cmd": cmd_query_packet,
        "rsp": rsp_ok_means_supported,
        "name": "query if threads in stop reply packets are supported",
    },
    "QSetDetachOnError:": {
        "cmd": cmd_QSetWithUnsigned,
        "rsp": rsp_ok_means_success,
        "name": "set if we should detach on error",
    },
    "QSetDisableASLR:": {
        "cmd": cmd_QSetWithUnsigned,
        "rsp": rsp_ok_means_success,
        "name": "set if we should disable ASLR",
    },
    "qLaunchSuccess": {
        "cmd": cmd_query_packet,
        "rsp": rsp_ok_means_success,
        "name": "check on launch success for the A packet",
    },
    "A": {"cmd": cmd_A, "rsp": rsp_ok_means_success, "name": "launch process"},
    "QLaunchArch:": {
        "cmd": cmd_QSetWithString,
        "rsp": rsp_ok_means_supported,
        "name": "set the arch to launch in case the file contains multiple architectures",
    },
    "qVAttachOrWaitSupported": {
        "cmd": cmd_query_packet,
        "rsp": rsp_ok_means_supported,
        "name": "set the launch architecture",
    },
    "qHostInfo": {
        "cmd": cmd_query_packet,
        "rsp": rsp_dump_key_value_pairs,
        "name": "get host information",
    },
    "qC": {"cmd": cmd_qC, "rsp": rsp_qC, "name": "return the current thread ID"},
    "vCont": {"cmd": cmd_vCont, "rsp": rsp_vCont, "name": "extended continue command"},
    "qSpeedTest": {
        "cmd": cmd_qSpeedTest,
        "rsp": rsp_qSpeedTest,
        "name": "speed test packdet",
    },
    "vAttach": {"cmd": cmd_vAttach, "rsp": rsp_stop_reply, "name": "attach to process"},
    "c": {"cmd": cmd_c, "rsp": rsp_stop_reply, "name": "continue"},
    "s": {"cmd": cmd_s, "rsp": rsp_stop_reply, "name": "step"},
    "qRegisterInfo": {
        "cmd": cmd_qRegisterInfo,
        "rsp": rsp_qRegisterInfo,
        "name": "query register info",
    },
    "qfThreadInfo": {
        "cmd": cmd_qThreadInfo,
        "rsp": rsp_qThreadInfo,
        "name": "get current thread list",
    },
    "qsThreadInfo": {
        "cmd": cmd_qThreadInfo,
        "rsp": rsp_qThreadInfo,
        "name": "get current thread list",
    },
    "qShlibInfoAddr": {
        "cmd": cmd_query_packet,
        "rsp": rsp_hex_big_endian,
        "name": "get shared library info address",
    },
    "qMemoryRegionInfo": {
        "cmd": cmd_mem_rgn_info,
        "rsp": rsp_dump_key_value_pairs,
        "name": "get memory region information",
    },
    "qProcessInfo": {
        "cmd": cmd_query_packet,
        "rsp": rsp_dump_key_value_pairs,
        "name": "get process info",
    },
    "qSupported": {
        "cmd": cmd_query_packet,
        "rsp": rsp_ok_means_supported,
        "name": "query supported",
    },
    "qXfer:": {"cmd": cmd_qXfer, "rsp": rsp_qXfer, "name": "qXfer"},
    "qSymbol:": {"cmd": cmd_qSymbol, "rsp": rsp_qSymbol, "name": "qSymbol"},
    "QSetSTDIN:": {
        "cmd": cmd_QSetWithHexString,
        "rsp": rsp_ok_means_success,
        "name": "set STDIN prior to launching with A packet",
    },
    "QSetSTDOUT:": {
        "cmd": cmd_QSetWithHexString,
        "rsp": rsp_ok_means_success,
        "name": "set STDOUT prior to launching with A packet",
    },
    "QSetSTDERR:": {
        "cmd": cmd_QSetWithHexString,
        "rsp": rsp_ok_means_success,
        "name": "set STDERR prior to launching with A packet",
    },
    "QEnvironment:": {
        "cmd": cmd_QSetWithString,
        "rsp": rsp_ok_means_success,
        "name": "set an environment variable prior to launching with A packet",
    },
    "QEnvironmentHexEncoded:": {
        "cmd": cmd_QSetWithHexString,
        "rsp": rsp_ok_means_success,
        "name": "set an environment variable prior to launching with A packet",
    },
    "x": {
        "cmd": cmd_read_mem_bin,
        "rsp": rsp_mem_bin_bytes,
        "name": "read memory binary",
    },
    "X": {
        "cmd": cmd_write_memory,
        "rsp": rsp_ok_means_success,
        "name": "write memory binary",
    },
    "m": {"cmd": cmd_read_memory, "rsp": rsp_memory_bytes, "name": "read memory"},
    "M": {"cmd": cmd_write_memory, "rsp": rsp_ok_means_success, "name": "write memory"},
    "_M": {"cmd": cmd_alloc_memory, "rsp": rsp_alloc_memory, "name": "allocate memory"},
    "_m": {
        "cmd": cmd_dealloc_memory,
        "rsp": rsp_ok_means_success,
        "name": "deallocate memory",
    },
    "p": {
        "cmd": cmd_read_one_reg,
        "rsp": rsp_read_one_reg,
        "name": "read single register",
    },
    "P": {
        "cmd": cmd_write_one_reg,
        "rsp": rsp_ok_means_success,
        "name": "write single register",
    },
    "g": {
        "cmd": cmd_read_all_regs,
        "rsp": rsp_read_all_regs,
        "name": "read all registers",
    },
    "G": {
        "cmd": cmd_write_all_regs,
        "rsp": rsp_ok_means_success,
        "name": "write all registers",
    },
    "z": {
        "cmd": cmd_bp,
        "rsp": rsp_ok_means_success,
        "name": "clear breakpoint or watchpoint",
    },
    "Z": {
        "cmd": cmd_bp,
        "rsp": rsp_ok_means_success,
        "name": "set breakpoint or watchpoint",
    },
    "k": {"cmd": cmd_kill, "rsp": rsp_stop_reply, "name": "kill process"},
    "jThreadsInfo": {
        "cmd": cmd_jThreadsInfo,
        "rsp": rsp_json,
        "name": "JSON get all threads info",
    },
    "jGetLoadedDynamicLibrariesInfos:": {
        "cmd": cmd_jGetLoadedDynamicLibrariesInfos,
        "rsp": rsp_jGetLoadedDynamicLibrariesInfos,
        "name": "JSON get loaded dynamic libraries",
    },
}


def calculate_mean_and_standard_deviation(floats):
    sum = 0.0
    count = len(floats)
    if count == 0:
        return (0.0, 0.0)
    for f in floats:
        sum += f
    mean = sum / count
    accum = 0.0
    for f in floats:
        delta = f - mean
        accum += delta * delta

    std_dev = math.sqrt(accum / (count - 1))
    return (mean, std_dev)


def parse_gdb_log_file(path, options):
    f = open(path)
    parse_gdb_log(f, options)
    f.close()


def round_up(n, incr):
    return float(((int(n) + incr) / incr) * incr)


def plot_latencies(sec_times):
    # import numpy as np
    import matplotlib.pyplot as plt

    for i, name in enumerate(sec_times.keys()):
        times = sec_times[name]
        if len(times) <= 1:
            continue
        plt.subplot(2, 1, 1)
        plt.title('Packet "%s" Times' % (name))
        plt.xlabel("Packet")
        units = "ms"
        adj_times = []
        max_time = 0.0
        for time in times:
            time = time * 1000.0
            adj_times.append(time)
            if time > max_time:
                max_time = time
        if max_time < 1.0:
            units = "us"
            max_time = 0.0
            for i in range(len(adj_times)):
                adj_times[i] *= 1000.0
                if adj_times[i] > max_time:
                    max_time = adj_times[i]
        plt.ylabel("Time (%s)" % (units))
        max_y = None
        for i in [5.0, 10.0, 25.0, 50.0]:
            if max_time < i:
                max_y = round_up(max_time, i)
                break
        if max_y is None:
            max_y = round_up(max_time, 100.0)
        plt.ylim(0.0, max_y)
        plt.plot(adj_times, "o-")
        plt.show()


def parse_gdb_log(file, options):
    """Parse a GDB log file that was generated by enabling logging with:
    (lldb) log enable --threadsafe --timestamp --file <FILE> gdb-remote packets
    This log file will contain timestamps and this function will then normalize
    those packets to be relative to the first value timestamp that is found and
    show delta times between log lines and also keep track of how long it takes
    for GDB remote commands to make a send/receive round trip. This can be
    handy when trying to figure out why some operation in the debugger is taking
    a long time during a preset set of debugger commands."""

    tricky_commands = ["qRegisterInfo"]
    timestamp_regex = re.compile(r"(\s*)([1-9][0-9]+\.[0-9]+)([^0-9].*)$")
    packet_name_regex = re.compile("([A-Za-z_]+)[^a-z]")
    packet_transmit_name_regex = re.compile(
        "(?P<direction>send|read) packet: (?P<packet>.*)"
    )
    packet_contents_name_regex = re.compile(r"\$([^#]*)#[0-9a-fA-F]{2}")
    packet_checksum_regex = re.compile(".*#[0-9a-fA-F]{2}$")
    packet_names_regex_str = "(" + "|".join(gdb_remote_commands.keys()) + ")(.*)"
    packet_names_regex = re.compile(packet_names_regex_str)

    base_time = 0.0
    last_time = 0.0
    min_time = 100000000.0
    packet_total_times = {}
    all_packet_times = []
    packet_times = {}
    packet_counts = {}
    lines = file.read().splitlines()
    last_command = None
    last_command_args = None
    last_command_packet = None
    hide_next_response = False
    num_lines = len(lines)
    skip_count = 0
    for line_index, line in enumerate(lines):
        # See if we need to skip any lines
        if skip_count > 0:
            skip_count -= 1
            continue
        m = packet_transmit_name_regex.search(line)
        is_command = False
        direction = None
        if m:
            direction = m.group("direction")
            is_command = direction == "send"
            packet = m.group("packet")
            sys.stdout.write(options.colors.green())
            if not options.quiet and not hide_next_response:
                print("#  ", line)
            sys.stdout.write(options.colors.reset())

            # print 'direction = "%s", packet = "%s"' % (direction, packet)

            if packet[0] == "+":
                if is_command:
                    print("-->", end=" ")
                else:
                    print("<--", end=" ")
                if not options.quiet:
                    print("ACK")
                continue
            elif packet[0] == "-":
                if is_command:
                    print("-->", end=" ")
                else:
                    print("<--", end=" ")
                if not options.quiet:
                    print("NACK")
                continue
            elif packet[0] == "$":
                m = packet_contents_name_regex.match(packet)
                if not m and packet[0] == "$":
                    multiline_packet = packet
                    idx = line_index + 1
                    while idx < num_lines:
                        if not options.quiet and not hide_next_response:
                            print("#  ", lines[idx])
                        multiline_packet += lines[idx]
                        m = packet_contents_name_regex.match(multiline_packet)
                        if m:
                            packet = multiline_packet
                            skip_count = idx - line_index
                            break
                        else:
                            idx += 1
                if m:
                    if is_command:
                        print("-->", end=" ")
                    else:
                        print("<--", end=" ")
                    contents = decode_packet(m.group(1))
                    if is_command:
                        hide_next_response = False
                        m = packet_names_regex.match(contents)
                        if m:
                            last_command = m.group(1)
                            if last_command == "?":
                                last_command = "\\?"
                            packet_name = last_command
                            last_command_args = m.group(2)
                            last_command_packet = contents
                            hide_next_response = gdb_remote_commands[last_command][
                                "cmd"
                            ](options, last_command, last_command_args)
                        else:
                            packet_match = packet_name_regex.match(contents)
                            if packet_match:
                                packet_name = packet_match.group(1)
                                for tricky_cmd in tricky_commands:
                                    if packet_name.find(tricky_cmd) == 0:
                                        packet_name = tricky_cmd
                            else:
                                packet_name = contents
                            last_command = None
                            last_command_args = None
                            last_command_packet = None
                    elif last_command:
                        gdb_remote_commands[last_command]["rsp"](
                            options, last_command, last_command_args, contents
                        )
                else:
                    print('error: invalid packet: "', packet, '"')
            else:
                print("???")
        else:
            print("## ", line)
        match = timestamp_regex.match(line)
        if match:
            curr_time = float(match.group(2))
            if last_time and not is_command:
                delta = curr_time - last_time
                all_packet_times.append(delta)
            delta = 0.0
            if base_time:
                delta = curr_time - last_time
            else:
                base_time = curr_time

            if not is_command:
                if line.find("read packet: $") >= 0 and packet_name:
                    if packet_name in packet_total_times:
                        packet_total_times[packet_name] += delta
                        packet_counts[packet_name] += 1
                    else:
                        packet_total_times[packet_name] = delta
                        packet_counts[packet_name] = 1
                    if packet_name not in packet_times:
                        packet_times[packet_name] = []
                    packet_times[packet_name].append(delta)
                    packet_name = None
                if min_time > delta:
                    min_time = delta

            if not options or not options.quiet:
                print(
                    "%s%.6f %+.6f%s"
                    % (match.group(1), curr_time - base_time, delta, match.group(3))
                )
            last_time = curr_time
        # else:
        #     print line
    (average, std_dev) = calculate_mean_and_standard_deviation(all_packet_times)
    if average and std_dev:
        print(
            "%u packets with average packet time of %f and standard deviation of %f"
            % (len(all_packet_times), average, std_dev)
        )
    if packet_total_times:
        total_packet_time = 0.0
        total_packet_count = 0
        for key, vvv in packet_total_times.items():
            # print '  key = (%s) "%s"' % (type(key), key)
            # print 'value = (%s) %s' % (type(vvv), vvv)
            # if type(vvv) == 'float':
            total_packet_time += vvv
        for key, vvv in packet_counts.items():
            total_packet_count += vvv

        print("#------------------------------------------------------------")
        print("# Packet timing summary:")
        print(
            "# Totals: time = %6f, count = %6d"
            % (total_packet_time, total_packet_count)
        )
        print("# Min packet time: time = %6f" % (min_time))
        print("#------------------------------------------------------------")
        print("# Packet                   Time (sec)  Percent Count  Latency")
        print("#------------------------- ----------- ------- ------ -------")
        if options and options.sort_count:
            res = sorted(packet_counts, key=packet_counts.__getitem__, reverse=True)
        else:
            res = sorted(
                packet_total_times, key=packet_total_times.__getitem__, reverse=True
            )

        if last_time > 0.0:
            for item in res:
                packet_total_time = packet_total_times[item]
                packet_percent = (packet_total_time / total_packet_time) * 100.0
                packet_count = packet_counts[item]
                print(
                    "  %24s %11.6f  %5.2f%% %6d %9.6f"
                    % (
                        item,
                        packet_total_time,
                        packet_percent,
                        packet_count,
                        float(packet_total_time) / float(packet_count),
                    )
                )
        if options and options.plot:
            plot_latencies(packet_times)


if __name__ == "__main__":
    usage = "usage: gdbremote [options]"
    description = """The command disassembles a GDB remote packet log."""
    parser = optparse.OptionParser(
        description=description, prog="gdbremote", usage=usage
    )
    parser.add_option(
        "-v",
        "--verbose",
        action="store_true",
        dest="verbose",
        help="display verbose debug info",
        default=False,
    )
    parser.add_option(
        "-q",
        "--quiet",
        action="store_true",
        dest="quiet",
        help="display verbose debug info",
        default=False,
    )
    parser.add_option(
        "-C",
        "--color",
        action="store_true",
        dest="color",
        help="add terminal colors",
        default=False,
    )
    parser.add_option(
        "-c",
        "--sort-by-count",
        action="store_true",
        dest="sort_count",
        help="display verbose debug info",
        default=False,
    )
    parser.add_option(
        "--crashlog",
        type="string",
        dest="crashlog",
        help="symbolicate using a darwin crash log file",
        default=False,
    )
    try:
        (options, args) = parser.parse_args(sys.argv[1:])
    except:
        print("error: argument error")
        sys.exit(1)

    options.colors = TerminalColors(options.color)
    options.symbolicator = None
    if options.crashlog:
        import lldb

        lldb.debugger = lldb.SBDebugger.Create()
        import lldb.macosx.crashlog

        options.symbolicator = lldb.macosx.crashlog.CrashLog(options.crashlog)
        print("%s" % (options.symbolicator))

    # This script is being run from the command line, create a debugger in case we are
    # going to use any debugger functions in our function.
    if len(args):
        for file in args:
            print(
                "#----------------------------------------------------------------------"
            )
            print("# GDB remote log file: '%s'" % file)
            print(
                "#----------------------------------------------------------------------"
            )
            parse_gdb_log_file(file, options)
        if options.symbolicator:
            print("%s" % (options.symbolicator))
    else:
        parse_gdb_log(sys.stdin, options)


def __lldb_init_module(debugger, internal_dict):
    # This initializer is being run from LLDB in the embedded command interpreter
    # Add any commands contained in this module to LLDB
    debugger.HandleCommand(
        "command script add -o -f gdbremote.start_gdb_log start_gdb_log"
    )
    debugger.HandleCommand(
        "command script add -o -f gdbremote.stop_gdb_log stop_gdb_log"
    )
    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'
    )
