def __init__(self, debuggable, sock, system, verbose=False): self._verbose = verbose self._debuggable = debuggable self._socket = sock self._low_level_protocol = GdbLowlevelProtocol(sock, self._message_received, verbose=self._verbose) self._low_level_protocol.start() self._system = system self._system.register_event_listener(self.handle_event) self._breakpoints = {}
def __init__(self, debuggable, sock, system, verbose=False): self._verbose=verbose self._debuggable = debuggable self._socket = sock self._low_level_protocol = GdbLowlevelProtocol(sock, self._message_received, verbose=self._verbose) self._low_level_protocol.start() self._system=system self._system.register_event_listener(self.handle_event) self._breakpoints = {}
class GdbServer(object): def __init__(self, debuggable, sock, system, verbose=False): self._verbose=verbose self._debuggable = debuggable self._socket = sock self._low_level_protocol = GdbLowlevelProtocol(sock, self._message_received, verbose=self._verbose) self._low_level_protocol.start() self._system=system self._system.register_event_listener(self.handle_event) self._breakpoints = {} def handle_event(self, evt): # TODO this is very very verbose ... if self._verbose: log.info("gdb_server handle_event recieved : %s", evt) if 'EVENT_BREAKPOINT' in evt['tags'] or 'EVENT_END_STEPPING' in evt['tags'] : self._low_level_protocol.send_message("S05") def _message_received(self, msg): if self._verbose: print("Received message: %s" % msg) opcode = msg[0] if opcode == 'm': address = int(msg[1:].split(',')[0], 16) size = int(msg[1:].split(',')[1]) if size in [1, 2, 4]: value = self._debuggable.read_typed_memory(address, size) self._low_level_protocol.send_message("".join(["%02x" % x for x in struct.pack("<%s" % {1: "B", 2: "H", 4: "L"}[size], value)])) else: value = self._debuggable.read_untyped_memory(address, size) self._low_level_protocol.send_message("".join(["%02x" % x for x in value])) elif opcode == 'M': address_size = msg[1:].split(":")[0] address = int(address_size.split(",")[0], 16) size = int(address_size.split(",")[1], 16) data = bytes([int("".join(x), 16) for x in zip(*[iter(msg[1:].split(":")[1])] * 2)]) assert(len(data) == size) if size in [1, 2, 4]: (value, ) = struct.unpack("<%s" % {1: "B", 2: "H", 4: "L"}[size], data) self._debuggable.write_typed_memory(address, size, value) else: self._debuggable.write_untyped_memory(address, data) #TODO: On error reply with error message self._low_level_protocol.send_message("OK") elif opcode == 'g': #TODO: ARM specific registers = ["r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc", "cpsr"] register_values = [self._debuggable.get_register(x) for x in registers] data = "".join(["".join(["%02x" % y for y in struct.pack("<L", x)]) for x in register_values]) self._low_level_protocol.send_message(data) elif opcode == 'G': registers = ["r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc", "cpsr"] register_data = [int("".join(x), 16) for x in zip(*[iter(msg[1:])] * 2)] register_values = [struct.unpack("<L", bytes(x)) for x in zip(*[iter(register_data)] * 4)] for (reg, val) in zip(registers, register_values): self._debuggable.set_register(reg, val) self._low_level_protocol.send_message("OK") elif opcode == 'p': regnr = int(msg[1:], 16) value = self._debuggable.get_register_from_nr(regnr) self._low_level_protocol.send_message("".join(["%02x" % x for x in struct.pack("<L", value)])) elif opcode == 'P': regnr = int(msg[1:].split("=")[0], 16) value_wrong_endianness = int(msg[1:].split("=")[1], 16) value = struct.unpack("<L", struct.pack(">L", value_wrong_endianness))[0] self._debuggable.set_register(regnr, value) self._low_level_protocol.send_message("OK") elif opcode == 'c': self._debuggable.cont() elif opcode == 'z': tipe = ord(msg[1]) - ord('0') address = int(msg[1:].split(",")[1], 16) kind = msg[1:].split(",")[2] if tipe in [0, 1]: self._breakpoints[address].delete() del self._breakpoints[address] # self._debuggable.clear_breakpoint(address, ) else: assert(False) #Unimplemented break/watchpoint type self._low_level_protocol.send_message("OK") elif opcode == 'Z': tipe = ord(msg[1]) - ord('0') address = int(msg[1:].split(",")[1], 16) kind = msg[1:].split(",")[2] if tipe in [0, 1]: bkpt = self._debuggable.set_breakpoint(address) self._breakpoints[address] = bkpt else: assert(False) #Unimplemented break/watchpoint type self._low_level_protocol.send_message("OK") elif opcode == '?': #TODO: Return real state instead of dummy self._low_level_protocol.send_message("S05") elif opcode == 's': self._debuggable.stepi() elif opcode in ['v','q','H']: log.info("gdb opcode '%s' not supported, but should be ok"% opcode) self._low_level_protocol.send_message("") else : log.error("gdb_server.py: unknown gdb opcode '%s' (not implemented?)"% opcode) self._low_level_protocol.send_message("")
class GdbServer: def __init__(self, debuggable, sock, system, verbose=False): self._verbose = verbose self._debuggable = debuggable self._socket = sock self._low_level_protocol = GdbLowlevelProtocol(sock, self._message_received, verbose=self._verbose) self._low_level_protocol.start() self._system = system self._system.register_event_listener(self.handle_event) self._breakpoints = {} def handle_event(self, evt): # TODO this is very very verbose ... if self._verbose: log.info("gdb_server handle_event recieved : %s", evt) if 'EVENT_BREAKPOINT' in evt['tags'] or 'EVENT_END_STEPPING' in evt[ 'tags']: self._low_level_protocol.send_message("S05") def _message_received(self, msg): if self._verbose: print("Received message: %s" % msg) opcode = msg[0] if opcode == 'm': address = int(msg[1:].split(',')[0], 16) size = int(msg[1:].split(',')[1]) if size in [1, 2, 4]: value = self._debuggable.read_typed_memory(address, size) self._low_level_protocol.send_message("".join([ "%02x" % x for x in struct.pack( "<%s" % { 1: "B", 2: "H", 4: "L" }[size], value) ])) else: value = self._debuggable.read_untyped_memory(address, size) self._low_level_protocol.send_message("".join( ["%02x" % x for x in value])) elif opcode == 'M': address_size = msg[1:].split(":")[0] address = int(address_size.split(",")[0], 16) size = int(address_size.split(",")[1], 16) data = bytes([ int("".join(x), 16) for x in zip(*[iter(msg[1:].split(":")[1])] * 2) ]) assert (len(data) == size) if size in [1, 2, 4]: (value, ) = struct.unpack( "<%s" % { 1: "B", 2: "H", 4: "L" }[size], data) self._debuggable.write_typed_memory(address, size, value) else: self._debuggable.write_untyped_memory(address, data) #TODO: On error reply with error message self._low_level_protocol.send_message("OK") elif opcode == 'g': #TODO: ARM specific registers = [ "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc", "cpsr" ] register_values = [ self._debuggable.get_register(x) for x in registers ] data = "".join([ "".join(["%02x" % y for y in struct.pack("<L", x)]) for x in register_values ]) self._low_level_protocol.send_message(data) elif opcode == 'G': registers = [ "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc", "cpsr" ] register_data = [ int("".join(x), 16) for x in zip(*[iter(msg[1:])] * 2) ] register_values = [ struct.unpack("<L", bytes(x)) for x in zip(*[iter(register_data)] * 4) ] for (reg, val) in zip(registers, register_values): self._debuggable.set_register(reg, val) self._low_level_protocol.send_message("OK") elif opcode == 'p': regnr = int(msg[1:], 16) value = self._debuggable.get_register_from_nr(regnr) self._low_level_protocol.send_message("".join( ["%02x" % x for x in struct.pack("<L", value)])) elif opcode == 'P': regnr = int(msg[1:].split("=")[0], 16) value_wrong_endianness = int(msg[1:].split("=")[1], 16) value = struct.unpack("<L", struct.pack(">L", value_wrong_endianness))[0] self._debuggable.set_register(regnr, value) self._low_level_protocol.send_message("OK") elif opcode == 'c': self._debuggable.cont() elif opcode == 'z': tipe = ord(msg[1]) - ord('0') address = int(msg[1:].split(",")[1], 16) kind = msg[1:].split(",")[2] if tipe in [0, 1]: self._breakpoints[address].delete() del self._breakpoints[address] # self._debuggable.clear_breakpoint(address, ) else: assert (False) #Unimplemented break/watchpoint type self._low_level_protocol.send_message("OK") elif opcode == 'Z': tipe = ord(msg[1]) - ord('0') address = int(msg[1:].split(",")[1], 16) kind = msg[1:].split(",")[2] if tipe in [0, 1]: bkpt = self._debuggable.set_breakpoint(address) self._breakpoints[address] = bkpt else: assert (False) #Unimplemented break/watchpoint type self._low_level_protocol.send_message("OK") elif opcode == '?': #TODO: Return real state instead of dummy self._low_level_protocol.send_message("S05") elif opcode == 's': self._debuggable.stepi() elif opcode in ['v', 'q', 'H']: log.info("gdb opcode '%s' not supported, but should be ok" % opcode) self._low_level_protocol.send_message("") else: log.error( "gdb_server.py: unknown gdb opcode '%s' (not implemented?)" % opcode) self._low_level_protocol.send_message("")