aboutsummaryrefslogtreecommitdiff
path: root/examples/python/gdbremote.py
diff options
context:
space:
mode:
Diffstat (limited to 'examples/python/gdbremote.py')
-rwxr-xr-xexamples/python/gdbremote.py53
1 files changed, 41 insertions, 12 deletions
diff --git a/examples/python/gdbremote.py b/examples/python/gdbremote.py
index 7d5874e8b0c7..a6ff3f5978e4 100755
--- a/examples/python/gdbremote.py
+++ b/examples/python/gdbremote.py
@@ -322,6 +322,15 @@ def is_hex_byte(str):
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)
+ if all(c in string.printable for c in s):
+ return s
+ except TypeError:
+ pass
+ return None
+
# global register info list
g_register_infos = list()
g_max_register_info_name_len = 0
@@ -638,6 +647,14 @@ def cmd_qSymbol(options, cmd, args):
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:
@@ -766,7 +783,11 @@ def dump_key_value_pairs(key_value_pairs):
for key_value_pair in key_value_pairs:
key = key_value_pair[0]
value = key_value_pair[1]
- print "%*s = %s" % (max_key_len, key, value)
+ 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):
@@ -910,26 +931,29 @@ def rsp_qThreadInfo(options, cmd, cmd_args, rsp):
def rsp_hex_big_endian(options, cmd, cmd_args, rsp):
- packet = Packet(rsp)
- uval = packet.get_hex_uint('big')
- print '%s: 0x%x' % (cmd, uval)
+ 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_number()
+ addr = packet.get_hex_uint('big')
comma = packet.get_char()
- size = packet.get_number()
+ 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_number()
+ addr = packet.get_hex_uint('big')
comma = packet.get_char()
- size = packet.get_number()
+ size = packet.get_hex_uint('big')
print 'memory:'
if size > 0:
dump_hex_memory_buffer(addr, rsp)
@@ -1192,11 +1216,11 @@ gdb_remote_commands = {
'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_query_packet, 'rsp': rsp_ok_means_success, 'name': "set if we should detach on error"},
- 'QSetDisableASLR': {'cmd': cmd_query_packet, 'rsp': rsp_ok_means_success, 'name': "set if we should disable ASLR"},
+ '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_query_packet, 'rsp': rsp_ok_means_supported, 'name': "set if we should disable ASLR"},
+ '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"},
@@ -1213,6 +1237,11 @@ gdb_remote_commands = {
'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"},
@@ -1269,7 +1298,7 @@ def parse_gdb_log(file, options):
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('\$([^#]+)#[0-9a-fA-F]{2}')
+ packet_contents_name_regex = re.compile('\$([^#]*)#[0-9a-fA-F]{2}')
packet_checksum_regex = re.compile('.*#[0-9a-fA-F]{2}$')
packet_names_regex_str = '(' + \
'|'.join(gdb_remote_commands.keys()) + ')(.*)'