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