1*4d161f03STom Zanussi# failed system call counts, by pid 2*4d161f03STom Zanussi# (c) 2010, Tom Zanussi <[email protected]> 3*4d161f03STom Zanussi# Licensed under the terms of the GNU GPL License version 2 4*4d161f03STom Zanussi# 5*4d161f03STom Zanussi# Displays system-wide failed system call totals, broken down by pid. 6*4d161f03STom Zanussi# If a [comm] arg is specified, only syscalls called by [comm] are displayed. 7*4d161f03STom Zanussi 8*4d161f03STom Zanussiimport os 9*4d161f03STom Zanussiimport sys 10*4d161f03STom Zanussi 11*4d161f03STom Zanussisys.path.append(os.environ['PERF_EXEC_PATH'] + \ 12*4d161f03STom Zanussi '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') 13*4d161f03STom Zanussi 14*4d161f03STom Zanussifrom perf_trace_context import * 15*4d161f03STom Zanussifrom Core import * 16*4d161f03STom Zanussi 17*4d161f03STom Zanussiusage = "perf trace -s syscall-counts-by-pid.py [comm]\n"; 18*4d161f03STom Zanussi 19*4d161f03STom Zanussifor_comm = None 20*4d161f03STom Zanussi 21*4d161f03STom Zanussiif len(sys.argv) > 2: 22*4d161f03STom Zanussi sys.exit(usage) 23*4d161f03STom Zanussi 24*4d161f03STom Zanussiif len(sys.argv) > 1: 25*4d161f03STom Zanussi for_comm = sys.argv[1] 26*4d161f03STom Zanussi 27*4d161f03STom Zanussisyscalls = autodict() 28*4d161f03STom Zanussi 29*4d161f03STom Zanussidef trace_begin(): 30*4d161f03STom Zanussi pass 31*4d161f03STom Zanussi 32*4d161f03STom Zanussidef trace_end(): 33*4d161f03STom Zanussi print_error_totals() 34*4d161f03STom Zanussi 35*4d161f03STom Zanussidef raw_syscalls__sys_exit(event_name, context, common_cpu, 36*4d161f03STom Zanussi common_secs, common_nsecs, common_pid, common_comm, 37*4d161f03STom Zanussi id, ret): 38*4d161f03STom Zanussi if for_comm is not None: 39*4d161f03STom Zanussi if common_comm != for_comm: 40*4d161f03STom Zanussi return 41*4d161f03STom Zanussi 42*4d161f03STom Zanussi if ret < 0: 43*4d161f03STom Zanussi try: 44*4d161f03STom Zanussi syscalls[common_comm][common_pid][id][ret] += 1 45*4d161f03STom Zanussi except TypeError: 46*4d161f03STom Zanussi syscalls[common_comm][common_pid][id][ret] = 1 47*4d161f03STom Zanussi 48*4d161f03STom Zanussidef print_error_totals(): 49*4d161f03STom Zanussi if for_comm is not None: 50*4d161f03STom Zanussi print "\nsyscall errors for %s:\n\n" % (for_comm), 51*4d161f03STom Zanussi else: 52*4d161f03STom Zanussi print "\nsyscall errors:\n\n", 53*4d161f03STom Zanussi 54*4d161f03STom Zanussi print "%-30s %10s\n" % ("comm [pid]", "count"), 55*4d161f03STom Zanussi print "%-30s %10s\n" % ("------------------------------", \ 56*4d161f03STom Zanussi "----------"), 57*4d161f03STom Zanussi 58*4d161f03STom Zanussi comm_keys = syscalls.keys() 59*4d161f03STom Zanussi for comm in comm_keys: 60*4d161f03STom Zanussi pid_keys = syscalls[comm].keys() 61*4d161f03STom Zanussi for pid in pid_keys: 62*4d161f03STom Zanussi print "\n%s [%d]\n" % (comm, pid), 63*4d161f03STom Zanussi id_keys = syscalls[comm][pid].keys() 64*4d161f03STom Zanussi for id in id_keys: 65*4d161f03STom Zanussi print " syscall: %-16d\n" % (id), 66*4d161f03STom Zanussi ret_keys = syscalls[comm][pid][id].keys() 67*4d161f03STom Zanussi for ret, val in sorted(syscalls[comm][pid][id].iteritems(), key = lambda(k, v): (v, k), reverse = True): 68*4d161f03STom Zanussi print " err = %-20d %10d\n" % (ret, val), 69