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