xref: /openbmc/linux/tools/perf/scripts/python/failed-syscalls-by-pid.py (revision 597473720f4dc69749542bfcfed4a927a43d935e)
14d161f03STom Zanussi# failed system call counts, by pid
24d161f03STom Zanussi# (c) 2010, Tom Zanussi <tzanussi@gmail.com>
34d161f03STom Zanussi# Licensed under the terms of the GNU GPL License version 2
44d161f03STom Zanussi#
54d161f03STom Zanussi# Displays system-wide failed system call totals, broken down by pid.
64d161f03STom Zanussi# If a [comm] arg is specified, only syscalls called by [comm] are displayed.
74d161f03STom Zanussi
8*9b2700efSTony Jonesfrom __future__ import print_function
9*9b2700efSTony Jones
104d161f03STom Zanussiimport os
114d161f03STom Zanussiimport sys
124d161f03STom Zanussi
134d161f03STom Zanussisys.path.append(os.environ['PERF_EXEC_PATH'] + \
144d161f03STom Zanussi	'/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
154d161f03STom Zanussi
164d161f03STom Zanussifrom perf_trace_context import *
174d161f03STom Zanussifrom Core import *
186cc73614SArnaldo Carvalho de Melofrom Util import *
194d161f03STom Zanussi
20765532c8SArnaldo Carvalho de Melousage = "perf script -s syscall-counts-by-pid.py [comm|pid]\n";
214d161f03STom Zanussi
224d161f03STom Zanussifor_comm = None
236cc73614SArnaldo Carvalho de Melofor_pid = None
244d161f03STom Zanussi
254d161f03STom Zanussiif len(sys.argv) > 2:
264d161f03STom Zanussi	sys.exit(usage)
274d161f03STom Zanussi
284d161f03STom Zanussiif len(sys.argv) > 1:
296cc73614SArnaldo Carvalho de Melo	try:
306cc73614SArnaldo Carvalho de Melo		for_pid = int(sys.argv[1])
316cc73614SArnaldo Carvalho de Melo	except:
324d161f03STom Zanussi		for_comm = sys.argv[1]
334d161f03STom Zanussi
344d161f03STom Zanussisyscalls = autodict()
354d161f03STom Zanussi
364d161f03STom Zanussidef trace_begin():
37*9b2700efSTony Jones	print("Press control+C to stop and show the summary")
384d161f03STom Zanussi
394d161f03STom Zanussidef trace_end():
404d161f03STom Zanussi	print_error_totals()
414d161f03STom Zanussi
424d161f03STom Zanussidef raw_syscalls__sys_exit(event_name, context, common_cpu,
434d161f03STom Zanussi	common_secs, common_nsecs, common_pid, common_comm,
440f5f5bcdSJoseph Schuchart	common_callchain, id, ret):
456cc73614SArnaldo Carvalho de Melo	if (for_comm and common_comm != for_comm) or \
466cc73614SArnaldo Carvalho de Melo	   (for_pid  and common_pid  != for_pid ):
474d161f03STom Zanussi		return
484d161f03STom Zanussi
494d161f03STom Zanussi	if ret < 0:
504d161f03STom Zanussi		try:
514d161f03STom Zanussi			syscalls[common_comm][common_pid][id][ret] += 1
524d161f03STom Zanussi		except TypeError:
534d161f03STom Zanussi			syscalls[common_comm][common_pid][id][ret] = 1
544d161f03STom Zanussi
5507100877SDaniel Bristot de Oliveiradef syscalls__sys_exit(event_name, context, common_cpu,
5607100877SDaniel Bristot de Oliveira	common_secs, common_nsecs, common_pid, common_comm,
5707100877SDaniel Bristot de Oliveira	id, ret):
5807100877SDaniel Bristot de Oliveira	raw_syscalls__sys_exit(**locals())
5907100877SDaniel Bristot de Oliveira
604d161f03STom Zanussidef print_error_totals():
614d161f03STom Zanussi	if for_comm is not None:
62*9b2700efSTony Jones		print("\nsyscall errors for %s:\n" % (for_comm))
634d161f03STom Zanussi	else:
64*9b2700efSTony Jones		print("\nsyscall errors:\n")
654d161f03STom Zanussi
66*9b2700efSTony Jones	print("%-30s  %10s" % ("comm [pid]", "count"))
67*9b2700efSTony Jones	print("%-30s  %10s" % ("------------------------------", "----------"))
684d161f03STom Zanussi
694d161f03STom Zanussi	comm_keys = syscalls.keys()
704d161f03STom Zanussi	for comm in comm_keys:
714d161f03STom Zanussi		pid_keys = syscalls[comm].keys()
724d161f03STom Zanussi		for pid in pid_keys:
73*9b2700efSTony Jones			print("\n%s [%d]" % (comm, pid))
744d161f03STom Zanussi			id_keys = syscalls[comm][pid].keys()
754d161f03STom Zanussi			for id in id_keys:
76*9b2700efSTony Jones				print("  syscall: %-16s" % syscall_name(id))
774d161f03STom Zanussi				ret_keys = syscalls[comm][pid][id].keys()
78*9b2700efSTony Jones				for ret, val in sorted(syscalls[comm][pid][id].items(), key = lambda kv: (kv[1], kv[0]), reverse = True):
79*9b2700efSTony Jones					print("    err = %-20s  %10d" % (strerror(ret), val))
80