2010-01-27 02:27:58 -06:00
# system call counts
# (c) 2010, Tom Zanussi <tzanussi@gmail.com>
# Licensed under the terms of the GNU GPL License version 2
#
# Displays system-wide system call totals, broken down by syscall.
# If a [comm] arg is specified, only syscalls called by [comm] are displayed.
2019-02-22 15:06:17 -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 17:11:25 -02:00
from Util import syscall_name
2010-01-27 02:27:58 -06:00
2010-12-23 13:10:22 -02:00
usage = " perf script -s syscall-counts.py [comm] \n " ;
2010-01-27 02:27:58 -06:00
for_comm = None
if len ( sys . argv ) > 2 :
sys . exit ( usage )
if len ( sys . argv ) > 1 :
for_comm = sys . argv [ 1 ]
syscalls = autodict ( )
def trace_begin ( ) :
2019-02-22 15:06:17 -08:00
print ( " Press control+C to stop and show the summary " )
2010-01-27 02:27:58 -06:00
def trace_end ( ) :
print_syscall_totals ( )
def raw_syscalls__sys_enter ( event_name , context , common_cpu ,
2019-03-01 17:18:57 -08:00
common_secs , common_nsecs , common_pid , common_comm ,
common_callchain , id , args ) :
2010-01-27 02:27:58 -06:00
if for_comm is not None :
if common_comm != for_comm :
return
try :
syscalls [ id ] + = 1
except TypeError :
syscalls [ id ] = 1
2014-06-11 16:09:08 -03:00
def syscalls__sys_enter ( event_name , context , common_cpu ,
2019-03-01 17:18:57 -08:00
common_secs , common_nsecs , common_pid , common_comm , id , args ) :
2014-06-11 16:09:08 -03:00
raw_syscalls__sys_enter ( * * locals ( ) )
2010-01-27 02:27:58 -06:00
def print_syscall_totals ( ) :
2019-03-01 17:18:57 -08:00
if for_comm is not None :
print ( " \n syscall events for %s : \n " % ( for_comm ) )
else :
print ( " \n syscall events: \n " )
print ( " %-40s %10s " % ( " event " , " count " ) )
print ( " %-40s %10s " % ( " ---------------------------------------- " ,
" ----------- " ) )
for id , val in sorted ( syscalls . items ( ) ,
key = lambda kv : ( kv [ 1 ] , kv [ 0 ] ) , reverse = True ) :
print ( " %-40s %10d " % ( syscall_name ( id ) , val ) )