2010-01-27 02:27:58 -06:00
# failed system call counts, by pid
# (c) 2010, Tom Zanussi <tzanussi@gmail.com>
# Licensed under the terms of the GNU GPL License version 2
#
# Displays system-wide failed system call totals, broken down by pid.
# If a [comm] arg is specified, only syscalls called by [comm] are displayed.
2019-02-22 15:06:08 -08:00
from __future__ import print_function
2010-01-27 02:27:58 -06:00
import os
import sys
sys . path . append ( os . environ [ ' PERF_EXEC_PATH ' ] + \
' /scripts/python/Perf-Trace-Util/lib/Perf/Trace ' )
from perf_trace_context import *
from Core import *
2010-10-25 15:15:10 -02:00
from Util import *
2010-01-27 02:27:58 -06:00
2010-12-23 13:10:22 -02:00
usage = " perf script -s syscall-counts-by-pid.py [comm|pid] \n " ;
2010-01-27 02:27:58 -06:00
for_comm = None
2010-10-25 15:15:10 -02:00
for_pid = None
2010-01-27 02:27:58 -06:00
if len ( sys . argv ) > 2 :
sys . exit ( usage )
if len ( sys . argv ) > 1 :
2010-10-25 15:15:10 -02:00
try :
for_pid = int ( sys . argv [ 1 ] )
except :
for_comm = sys . argv [ 1 ]
2010-01-27 02:27:58 -06:00
syscalls = autodict ( )
def trace_begin ( ) :
2019-02-22 15:06:08 -08:00
print ( " Press control+C to stop and show the summary " )
2010-01-27 02:27:58 -06:00
def trace_end ( ) :
print_error_totals ( )
def raw_syscalls__sys_exit ( event_name , context , common_cpu ,
common_secs , common_nsecs , common_pid , common_comm ,
2014-07-10 13:50:51 +02:00
common_callchain , id , ret ) :
2010-10-25 15:15:10 -02:00
if ( for_comm and common_comm != for_comm ) or \
( for_pid and common_pid != for_pid ) :
return
2010-01-27 02:27:58 -06:00
if ret < 0 :
try :
syscalls [ common_comm ] [ common_pid ] [ id ] [ ret ] + = 1
except TypeError :
syscalls [ common_comm ] [ common_pid ] [ id ] [ ret ] = 1
2014-06-11 16:09:08 -03:00
def syscalls__sys_exit ( event_name , context , common_cpu ,
common_secs , common_nsecs , common_pid , common_comm ,
id , ret ) :
raw_syscalls__sys_exit ( * * locals ( ) )
2010-01-27 02:27:58 -06:00
def print_error_totals ( ) :
2019-03-01 17:18:57 -08:00
if for_comm is not None :
print ( " \n syscall errors for %s : \n " % ( for_comm ) )
else :
print ( " \n syscall errors: \n " )
print ( " %-30s %10s " % ( " comm [pid] " , " count " ) )
print ( " %-30s %10s " % ( " ------------------------------ " , " ---------- " ) )
comm_keys = syscalls . keys ( )
for comm in comm_keys :
pid_keys = syscalls [ comm ] . keys ( )
for pid in pid_keys :
print ( " \n %s [ %d ] " % ( comm , pid ) )
id_keys = syscalls [ comm ] [ pid ] . keys ( )
for id in id_keys :
print ( " syscall: %-16s " % syscall_name ( id ) )
ret_keys = syscalls [ comm ] [ pid ] [ id ] . keys ( )
for ret , val in sorted ( syscalls [ comm ] [ pid ] [ id ] . items ( ) , key = lambda kv : ( kv [ 1 ] , kv [ 0 ] ) , reverse = True ) :
print ( " err = %-20s %10d " % ( strerror ( ret ) , val ) )