]>
Commit | Line | Data |
---|---|---|
4d161f03 TZ |
1 | # failed 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 failed system call totals, broken down by pid. | |
6 | # If a [comm] arg is specified, only syscalls called by [comm] are displayed. | |
7 | ||
9b2700ef TJ |
8 | from __future__ import print_function |
9 | ||
4d161f03 TZ |
10 | import os |
11 | import sys | |
12 | ||
13 | sys.path.append(os.environ['PERF_EXEC_PATH'] + \ | |
14 | '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') | |
15 | ||
16 | from perf_trace_context import * | |
17 | from Core import * | |
6cc73614 | 18 | from Util import * |
4d161f03 | 19 | |
765532c8 | 20 | usage = "perf script -s syscall-counts-by-pid.py [comm|pid]\n"; |
4d161f03 TZ |
21 | |
22 | for_comm = None | |
6cc73614 | 23 | for_pid = None |
4d161f03 TZ |
24 | |
25 | if len(sys.argv) > 2: | |
26 | sys.exit(usage) | |
27 | ||
28 | if len(sys.argv) > 1: | |
6cc73614 ACM |
29 | try: |
30 | for_pid = int(sys.argv[1]) | |
31 | except: | |
32 | for_comm = sys.argv[1] | |
4d161f03 TZ |
33 | |
34 | syscalls = autodict() | |
35 | ||
36 | def trace_begin(): | |
9b2700ef | 37 | print("Press control+C to stop and show the summary") |
4d161f03 TZ |
38 | |
39 | def trace_end(): | |
40 | print_error_totals() | |
41 | ||
42 | def raw_syscalls__sys_exit(event_name, context, common_cpu, | |
43 | common_secs, common_nsecs, common_pid, common_comm, | |
0f5f5bcd | 44 | common_callchain, id, ret): |
6cc73614 ACM |
45 | if (for_comm and common_comm != for_comm) or \ |
46 | (for_pid and common_pid != for_pid ): | |
47 | return | |
4d161f03 TZ |
48 | |
49 | if ret < 0: | |
50 | try: | |
51 | syscalls[common_comm][common_pid][id][ret] += 1 | |
52 | except TypeError: | |
53 | syscalls[common_comm][common_pid][id][ret] = 1 | |
54 | ||
07100877 DBO |
55 | def syscalls__sys_exit(event_name, context, common_cpu, |
56 | common_secs, common_nsecs, common_pid, common_comm, | |
57 | id, ret): | |
58 | raw_syscalls__sys_exit(**locals()) | |
59 | ||
4d161f03 | 60 | def print_error_totals(): |
b504d7f6 TJ |
61 | if for_comm is not None: |
62 | print("\nsyscall errors for %s:\n" % (for_comm)) | |
63 | else: | |
64 | print("\nsyscall errors:\n") | |
65 | ||
66 | print("%-30s %10s" % ("comm [pid]", "count")) | |
67 | print("%-30s %10s" % ("------------------------------", "----------")) | |
68 | ||
69 | comm_keys = syscalls.keys() | |
70 | for comm in comm_keys: | |
71 | pid_keys = syscalls[comm].keys() | |
72 | for pid in pid_keys: | |
73 | print("\n%s [%d]" % (comm, pid)) | |
74 | id_keys = syscalls[comm][pid].keys() | |
75 | for id in id_keys: | |
76 | print(" syscall: %-16s" % syscall_name(id)) | |
77 | ret_keys = syscalls[comm][pid][id].keys() | |
78 | for ret, val in sorted(syscalls[comm][pid][id].items(), key = lambda kv: (kv[1], kv[0]), reverse = True): | |
79 | print(" err = %-20s %10d" % (strerror(ret), val)) |