66 lines · python
1# system call counts2# (c) 2010, Tom Zanussi <tzanussi@gmail.com>3# Licensed under the terms of the GNU GPL License version 24#5# Displays system-wide system call totals, broken down by syscall.6# If a [comm] arg is specified, only syscalls called by [comm] are displayed.7 8from __future__ import print_function9 10import os11import sys12 13sys.path.append(os.environ['PERF_EXEC_PATH'] + \14 '/scripts/python/Perf-Trace-Util/lib/Perf/Trace')15 16from perf_trace_context import *17from Core import *18from Util import syscall_name19 20usage = "perf script -s syscall-counts.py [comm]\n";21 22for_comm = None23 24if len(sys.argv) > 2:25 sys.exit(usage)26 27if len(sys.argv) > 1:28 for_comm = sys.argv[1]29 30syscalls = autodict()31 32def trace_begin():33 print("Press control+C to stop and show the summary")34 35def trace_end():36 print_syscall_totals()37 38def raw_syscalls__sys_enter(event_name, context, common_cpu,39 common_secs, common_nsecs, common_pid, common_comm,40 common_callchain, id, args):41 if for_comm is not None:42 if common_comm != for_comm:43 return44 try:45 syscalls[id] += 146 except TypeError:47 syscalls[id] = 148 49def syscalls__sys_enter(event_name, context, common_cpu,50 common_secs, common_nsecs, common_pid, common_comm, id, args):51 raw_syscalls__sys_enter(**locals())52 53def print_syscall_totals():54 if for_comm is not None:55 print("\nsyscall events for %s:\n" % (for_comm))56 else:57 print("\nsyscall events:\n")58 59 print("%-40s %10s" % ("event", "count"))60 print("%-40s %10s" % ("----------------------------------------",61 "-----------"))62 63 for id, val in sorted(syscalls.items(),64 key = lambda kv: (kv[1], kv[0]), reverse = True):65 print("%-40s %10d" % (syscall_name(id), val))66