cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

syscall-counts-by-pid.py (2055B)


      1# system call counts, by pid
      2# (c) 2010, Tom Zanussi <tzanussi@gmail.com>
      3# Licensed under the terms of the GNU GPL License version 2
      4#
      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_function
      9
     10import os, sys
     11
     12sys.path.append(os.environ['PERF_EXEC_PATH'] + \
     13	'/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
     14
     15from perf_trace_context import *
     16from Core import *
     17from Util import syscall_name
     18
     19usage = "perf script -s syscall-counts-by-pid.py [comm]\n";
     20
     21for_comm = None
     22for_pid = None
     23
     24if len(sys.argv) > 2:
     25	sys.exit(usage)
     26
     27if len(sys.argv) > 1:
     28	try:
     29		for_pid = int(sys.argv[1])
     30	except:
     31		for_comm = sys.argv[1]
     32
     33syscalls = autodict()
     34
     35def trace_begin():
     36	print("Press control+C to stop and show the summary")
     37
     38def trace_end():
     39	print_syscall_totals()
     40
     41def raw_syscalls__sys_enter(event_name, context, common_cpu,
     42		common_secs, common_nsecs, common_pid, common_comm,
     43		common_callchain, id, args):
     44	if (for_comm and common_comm != for_comm) or \
     45		(for_pid and common_pid != for_pid ):
     46		return
     47	try:
     48		syscalls[common_comm][common_pid][id] += 1
     49	except TypeError:
     50		syscalls[common_comm][common_pid][id] = 1
     51
     52def syscalls__sys_enter(event_name, context, common_cpu,
     53		common_secs, common_nsecs, common_pid, common_comm,
     54		id, args):
     55	raw_syscalls__sys_enter(**locals())
     56
     57def print_syscall_totals():
     58	if for_comm is not None:
     59		print("\nsyscall events for %s:\n" % (for_comm))
     60	else:
     61		print("\nsyscall events by comm/pid:\n")
     62
     63	print("%-40s  %10s" % ("comm [pid]/syscalls", "count"))
     64	print("%-40s  %10s" % ("----------------------------------------",
     65				"----------"))
     66
     67	comm_keys = syscalls.keys()
     68	for comm in comm_keys:
     69		pid_keys = syscalls[comm].keys()
     70		for pid in pid_keys:
     71			print("\n%s [%d]" % (comm, pid))
     72			id_keys = syscalls[comm][pid].keys()
     73			for id, val in sorted(syscalls[comm][pid].items(),
     74				key = lambda kv: (kv[1], kv[0]), reverse = True):
     75				print("  %-38s  %10d" % (syscall_name(id), val))