[Lldb-commits] [lldb] r238065 - Fix this module to work with current packects and also to be able to figure out average packets speed and standard deviation.
Greg Clayton
gclayton at apple.com
Fri May 22 16:00:59 PDT 2015
Author: gclayton
Date: Fri May 22 18:00:59 2015
New Revision: 238065
URL: http://llvm.org/viewvc/llvm-project?rev=238065&view=rev
Log:
Fix this module to work with current packects and also to be able to figure out average packets speed and standard deviation.
Modified:
lldb/trunk/examples/python/gdbremote.py
Modified: lldb/trunk/examples/python/gdbremote.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/examples/python/gdbremote.py?rev=238065&r1=238064&r2=238065&view=diff
==============================================================================
--- lldb/trunk/examples/python/gdbremote.py (original)
+++ lldb/trunk/examples/python/gdbremote.py Fri May 22 18:00:59 2015
@@ -17,6 +17,7 @@
#----------------------------------------------------------------------
import commands
+import math
import optparse
import os
import re
@@ -436,10 +437,11 @@ class Packet:
def get_key_value_pairs(self):
kvp = list()
- key_value_pairs = string.split(self.str, ';')
- for key_value_pair in key_value_pairs:
- if len(key_value_pair):
- kvp.append(string.split(key_value_pair, ':'))
+ if ';' in self.str:
+ key_value_pairs = string.split(self.str, ';')
+ for key_value_pair in key_value_pairs:
+ if len(key_value_pair):
+ kvp.append(string.split(key_value_pair, ':'))
return kvp
def split(self, ch):
@@ -528,6 +530,7 @@ def rsp_dump_key_value_pairs(options, cm
packet = Packet(rsp)
key_value_pairs = packet.get_key_value_pairs()
for key_value_pair in key_value_pairs:
+ print key_value_pair
key = key_value_pair[0]
value = key_value_pair[1]
print " %s = %s" % (key, value)
@@ -835,6 +838,7 @@ 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_supported , 'name' : "query if we should detach on error" },
'qVAttachOrWaitSupported' : { 'cmd' : cmd_query_packet , 'rsp' : rsp_ok_means_supported , 'name' : "query if threads attach with optional wait is supported" },
'qHostInfo' : { 'cmd' : cmd_query_packet , 'rsp' : rsp_dump_key_value_pairs, 'name' : "get host information" },
'vCont' : { 'cmd' : cmd_vCont , 'rsp' : rsp_vCont , 'name' : "extended continue command" },
@@ -844,6 +848,8 @@ gdb_remote_commands = {
'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" },
'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" },
@@ -856,6 +862,21 @@ gdb_remote_commands = {
'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" },
}
+
+def calculate_mean_and_standard_deviation(floats):
+ sum = 0.0
+ count = len(floats)
+ 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(file, options):
'''Parse a GDB log file that was generated by enabling logging with:
(lldb) log enable --threadsafe --timestamp --file <FILE> gdb-remote packets
@@ -878,6 +899,7 @@ def parse_gdb_log_file(file, options):
last_time = 0.0
packet_send_time = 0.0
packet_total_times = {}
+ packet_times = []
packet_count = {}
file = open(file)
lines = file.read().splitlines()
@@ -885,29 +907,26 @@ def parse_gdb_log_file(file, options):
last_command_args = None
last_command_packet = None
for line in lines:
- packet_name = None
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 options.quiet:
- if is_command:
- print '-->', packet
- else:
- print '<--', packet
- else:
+ if not options.quiet:
print '# ', line
sys.stdout.write(options.colors.reset())
#print 'direction = "%s", packet = "%s"' % (direction, packet)
if packet[0] == '+':
- print 'ACK'
+ if not options.quiet: print 'ACK'
+ continue
elif packet[0] == '-':
- print 'NACK'
+ if not options.quiet: print 'NACK'
+ continue
elif packet[0] == '$':
m = packet_contents_name_regex.match(packet)
if m:
@@ -921,7 +940,7 @@ def parse_gdb_log_file(file, options):
last_command_packet = contents
gdb_remote_commands[last_command]['cmd'](options, last_command, last_command_args)
else:
- packet_match = packet_name_regex.match (line[idx+14:])
+ packet_match = packet_name_regex.match (contents)
if packet_match:
packet_name = packet_match.group(1)
for tricky_cmd in tricky_commands:
@@ -943,6 +962,9 @@ def parse_gdb_log_file(file, options):
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
+ packet_times.append(delta)
delta = 0.0
if base_time:
delta = curr_time - last_time
@@ -965,6 +987,8 @@ def parse_gdb_log_file(file, options):
last_time = curr_time
# else:
# print line
+ (average, std_dev) = calculate_mean_and_standard_deviation(packet_times)
+ print '%u packets with average packet time of %f and standard deviation of %f' % (len(packet_times), average, std_dev)
if packet_total_times:
total_packet_time = 0.0
total_packet_count = 0
@@ -978,7 +1002,7 @@ def parse_gdb_log_file(file, options):
print '#---------------------------------------------------'
print '# Packet timing summary:'
- print '# Totals: time - %6f count %6d' % (total_packet_time, total_packet_count)
+ print '# Totals: time = %6f, count = %6d' % (total_packet_time, total_packet_count)
print '#---------------------------------------------------'
print '# Packet Time (sec) Percent Count '
print '#------------------------- ---------- ------- ------'
More information about the lldb-commits
mailing list