mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	perf: Rename 'perf trace' to 'perf script'
Free the perf trace name space and rename the trace to 'script' which is a better match for the scripting engine. Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
		
							parent
							
								
									e53beacd23
								
							
						
					
					
						commit
						133dc4c39c
					
				
					 12 changed files with 120 additions and 120 deletions
				
			
		| 
						 | 
				
			
			@ -1,19 +1,19 @@
 | 
			
		|||
perf-trace-perl(1)
 | 
			
		||||
perf-script-perl(1)
 | 
			
		||||
==================
 | 
			
		||||
 | 
			
		||||
NAME
 | 
			
		||||
----
 | 
			
		||||
perf-trace-perl - Process trace data with a Perl script
 | 
			
		||||
perf-script-perl - Process trace data with a Perl script
 | 
			
		||||
 | 
			
		||||
SYNOPSIS
 | 
			
		||||
--------
 | 
			
		||||
[verse]
 | 
			
		||||
'perf trace' [-s [Perl]:script[.pl] ]
 | 
			
		||||
'perf script' [-s [Perl]:script[.pl] ]
 | 
			
		||||
 | 
			
		||||
DESCRIPTION
 | 
			
		||||
-----------
 | 
			
		||||
 | 
			
		||||
This perf trace option is used to process perf trace data using perf's
 | 
			
		||||
This perf script option is used to process perf script data using perf's
 | 
			
		||||
built-in Perl interpreter.  It reads and processes the input file and
 | 
			
		||||
displays the results of the trace analysis implemented in the given
 | 
			
		||||
Perl script, if any.
 | 
			
		||||
| 
						 | 
				
			
			@ -21,7 +21,7 @@ Perl script, if any.
 | 
			
		|||
STARTER SCRIPTS
 | 
			
		||||
---------------
 | 
			
		||||
 | 
			
		||||
You can avoid reading the rest of this document by running 'perf trace
 | 
			
		||||
You can avoid reading the rest of this document by running 'perf script
 | 
			
		||||
-g perl' in the same directory as an existing perf.data trace file.
 | 
			
		||||
That will generate a starter script containing a handler for each of
 | 
			
		||||
the event types in the trace file; it simply prints every available
 | 
			
		||||
| 
						 | 
				
			
			@ -30,13 +30,13 @@ field for each event in the trace file.
 | 
			
		|||
You can also look at the existing scripts in
 | 
			
		||||
~/libexec/perf-core/scripts/perl for typical examples showing how to
 | 
			
		||||
do basic things like aggregate event data, print results, etc.  Also,
 | 
			
		||||
the check-perf-trace.pl script, while not interesting for its results,
 | 
			
		||||
the check-perf-script.pl script, while not interesting for its results,
 | 
			
		||||
attempts to exercise all of the main scripting features.
 | 
			
		||||
 | 
			
		||||
EVENT HANDLERS
 | 
			
		||||
--------------
 | 
			
		||||
 | 
			
		||||
When perf trace is invoked using a trace script, a user-defined
 | 
			
		||||
When perf script is invoked using a trace script, a user-defined
 | 
			
		||||
'handler function' is called for each event in the trace.  If there's
 | 
			
		||||
no handler function defined for a given event type, the event is
 | 
			
		||||
ignored (or passed to a 'trace_handled' function, see below) and the
 | 
			
		||||
| 
						 | 
				
			
			@ -112,13 +112,13 @@ write a useful trace script.  The sections below cover the rest.
 | 
			
		|||
SCRIPT LAYOUT
 | 
			
		||||
-------------
 | 
			
		||||
 | 
			
		||||
Every perf trace Perl script should start by setting up a Perl module
 | 
			
		||||
Every perf script Perl script should start by setting up a Perl module
 | 
			
		||||
search path and 'use'ing a few support modules (see module
 | 
			
		||||
descriptions below):
 | 
			
		||||
 | 
			
		||||
----
 | 
			
		||||
 use lib "$ENV{'PERF_EXEC_PATH'}/scripts/perl/Perf-Trace-Util/lib";
 | 
			
		||||
 use lib "./Perf-Trace-Util/lib";
 | 
			
		||||
 use lib "$ENV{'PERF_EXEC_PATH'}/scripts/perl/perf-script-Util/lib";
 | 
			
		||||
 use lib "./perf-script-Util/lib";
 | 
			
		||||
 use Perf::Trace::Core;
 | 
			
		||||
 use Perf::Trace::Context;
 | 
			
		||||
 use Perf::Trace::Util;
 | 
			
		||||
| 
						 | 
				
			
			@ -162,7 +162,7 @@ sub trace_unhandled
 | 
			
		|||
----
 | 
			
		||||
 | 
			
		||||
The remaining sections provide descriptions of each of the available
 | 
			
		||||
built-in perf trace Perl modules and their associated functions.
 | 
			
		||||
built-in perf script Perl modules and their associated functions.
 | 
			
		||||
 | 
			
		||||
AVAILABLE MODULES AND FUNCTIONS
 | 
			
		||||
-------------------------------
 | 
			
		||||
| 
						 | 
				
			
			@ -170,7 +170,7 @@ AVAILABLE MODULES AND FUNCTIONS
 | 
			
		|||
The following sections describe the functions and variables available
 | 
			
		||||
via the various Perf::Trace::* Perl modules.  To use the functions and
 | 
			
		||||
variables from the given module, add the corresponding 'use
 | 
			
		||||
Perf::Trace::XXX' line to your perf trace script.
 | 
			
		||||
Perf::Trace::XXX' line to your perf script script.
 | 
			
		||||
 | 
			
		||||
Perf::Trace::Core Module
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
| 
						 | 
				
			
			@ -204,7 +204,7 @@ argument.
 | 
			
		|||
Perf::Trace::Util Module
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
Various utility functions for use with perf trace:
 | 
			
		||||
Various utility functions for use with perf script:
 | 
			
		||||
 | 
			
		||||
  nsecs($secs, $nsecs) - returns total nsecs given secs/nsecs pair
 | 
			
		||||
  nsecs_secs($nsecs) - returns whole secs portion given nsecs
 | 
			
		||||
| 
						 | 
				
			
			@ -214,4 +214,4 @@ Various utility functions for use with perf trace:
 | 
			
		|||
 | 
			
		||||
SEE ALSO
 | 
			
		||||
--------
 | 
			
		||||
linkperf:perf-trace[1]
 | 
			
		||||
linkperf:perf-script[1]
 | 
			
		||||
| 
						 | 
				
			
			@ -1,19 +1,19 @@
 | 
			
		|||
perf-trace-python(1)
 | 
			
		||||
perf-script-python(1)
 | 
			
		||||
====================
 | 
			
		||||
 | 
			
		||||
NAME
 | 
			
		||||
----
 | 
			
		||||
perf-trace-python - Process trace data with a Python script
 | 
			
		||||
perf-script-python - Process trace data with a Python script
 | 
			
		||||
 | 
			
		||||
SYNOPSIS
 | 
			
		||||
--------
 | 
			
		||||
[verse]
 | 
			
		||||
'perf trace' [-s [Python]:script[.py] ]
 | 
			
		||||
'perf script' [-s [Python]:script[.py] ]
 | 
			
		||||
 | 
			
		||||
DESCRIPTION
 | 
			
		||||
-----------
 | 
			
		||||
 | 
			
		||||
This perf trace option is used to process perf trace data using perf's
 | 
			
		||||
This perf script option is used to process perf script data using perf's
 | 
			
		||||
built-in Python interpreter.  It reads and processes the input file and
 | 
			
		||||
displays the results of the trace analysis implemented in the given
 | 
			
		||||
Python script, if any.
 | 
			
		||||
| 
						 | 
				
			
			@ -23,15 +23,15 @@ A QUICK EXAMPLE
 | 
			
		|||
 | 
			
		||||
This section shows the process, start to finish, of creating a working
 | 
			
		||||
Python script that aggregates and extracts useful information from a
 | 
			
		||||
raw perf trace stream.  You can avoid reading the rest of this
 | 
			
		||||
raw perf script stream.  You can avoid reading the rest of this
 | 
			
		||||
document if an example is enough for you; the rest of the document
 | 
			
		||||
provides more details on each step and lists the library functions
 | 
			
		||||
available to script writers.
 | 
			
		||||
 | 
			
		||||
This example actually details the steps that were used to create the
 | 
			
		||||
'syscall-counts' script you see when you list the available perf trace
 | 
			
		||||
scripts via 'perf trace -l'.  As such, this script also shows how to
 | 
			
		||||
integrate your script into the list of general-purpose 'perf trace'
 | 
			
		||||
'syscall-counts' script you see when you list the available perf script
 | 
			
		||||
scripts via 'perf script -l'.  As such, this script also shows how to
 | 
			
		||||
integrate your script into the list of general-purpose 'perf script'
 | 
			
		||||
scripts listed by that command.
 | 
			
		||||
 | 
			
		||||
The syscall-counts script is a simple script, but demonstrates all the
 | 
			
		||||
| 
						 | 
				
			
			@ -105,31 +105,31 @@ That single stream will be recorded in a file in the current directory
 | 
			
		|||
called perf.data.
 | 
			
		||||
 | 
			
		||||
Once we have a perf.data file containing our data, we can use the -g
 | 
			
		||||
'perf trace' option to generate a Python script that will contain a
 | 
			
		||||
'perf script' option to generate a Python script that will contain a
 | 
			
		||||
callback handler for each event type found in the perf.data trace
 | 
			
		||||
stream (for more details, see the STARTER SCRIPTS section).
 | 
			
		||||
 | 
			
		||||
----
 | 
			
		||||
# perf trace -g python
 | 
			
		||||
generated Python script: perf-trace.py
 | 
			
		||||
# perf script -g python
 | 
			
		||||
generated Python script: perf-script.py
 | 
			
		||||
 | 
			
		||||
The output file created also in the current directory is named
 | 
			
		||||
perf-trace.py.  Here's the file in its entirety:
 | 
			
		||||
perf-script.py.  Here's the file in its entirety:
 | 
			
		||||
 | 
			
		||||
# perf trace event handlers, generated by perf trace -g python
 | 
			
		||||
# perf script event handlers, generated by perf script -g python
 | 
			
		||||
# Licensed under the terms of the GNU GPL License version 2
 | 
			
		||||
 | 
			
		||||
# The common_* event handler fields are the most useful fields common to
 | 
			
		||||
# all events.  They don't necessarily correspond to the 'common_*' fields
 | 
			
		||||
# in the format files.  Those fields not available as handler params can
 | 
			
		||||
# be retrieved using Python functions of the form common_*(context).
 | 
			
		||||
# See the perf-trace-python Documentation for the list of available functions.
 | 
			
		||||
# See the perf-script-python Documentation for the list of available functions.
 | 
			
		||||
 | 
			
		||||
import os
 | 
			
		||||
import sys
 | 
			
		||||
 | 
			
		||||
sys.path.append(os.environ['PERF_EXEC_PATH'] + \
 | 
			
		||||
	'/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
 | 
			
		||||
	'/scripts/python/perf-script-Util/lib/Perf/Trace')
 | 
			
		||||
 | 
			
		||||
from perf_trace_context import *
 | 
			
		||||
from Core import *
 | 
			
		||||
| 
						 | 
				
			
			@ -160,7 +160,7 @@ def print_header(event_name, cpu, secs, nsecs, pid, comm):
 | 
			
		|||
----
 | 
			
		||||
 | 
			
		||||
At the top is a comment block followed by some import statements and a
 | 
			
		||||
path append which every perf trace script should include.
 | 
			
		||||
path append which every perf script script should include.
 | 
			
		||||
 | 
			
		||||
Following that are a couple generated functions, trace_begin() and
 | 
			
		||||
trace_end(), which are called at the beginning and the end of the
 | 
			
		||||
| 
						 | 
				
			
			@ -189,8 +189,8 @@ simply a utility function used for that purpose.  Let's rename the
 | 
			
		|||
script and run it to see the default output:
 | 
			
		||||
 | 
			
		||||
----
 | 
			
		||||
# mv perf-trace.py syscall-counts.py
 | 
			
		||||
# perf trace -s syscall-counts.py
 | 
			
		||||
# mv perf-script.py syscall-counts.py
 | 
			
		||||
# perf script -s syscall-counts.py
 | 
			
		||||
 | 
			
		||||
raw_syscalls__sys_enter     1 00840.847582083     7506 perf                  id=1, args=
 | 
			
		||||
raw_syscalls__sys_enter     1 00840.847595764     7506 perf                  id=1, args=
 | 
			
		||||
| 
						 | 
				
			
			@ -216,7 +216,7 @@ import os
 | 
			
		|||
import sys
 | 
			
		||||
 | 
			
		||||
sys.path.append(os.environ['PERF_EXEC_PATH'] + \
 | 
			
		||||
	'/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
 | 
			
		||||
	'/scripts/python/perf-script-Util/lib/Perf/Trace')
 | 
			
		||||
 | 
			
		||||
from perf_trace_context import *
 | 
			
		||||
from Core import *
 | 
			
		||||
| 
						 | 
				
			
			@ -279,7 +279,7 @@ import os
 | 
			
		|||
import sys
 | 
			
		||||
 | 
			
		||||
sys.path.append(os.environ['PERF_EXEC_PATH'] + \
 | 
			
		||||
	'/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
 | 
			
		||||
	'/scripts/python/perf-script-Util/lib/Perf/Trace')
 | 
			
		||||
 | 
			
		||||
from perf_trace_context import *
 | 
			
		||||
from Core import *
 | 
			
		||||
| 
						 | 
				
			
			@ -315,7 +315,7 @@ def print_syscall_totals():
 | 
			
		|||
 | 
			
		||||
The script can be run just as before:
 | 
			
		||||
 | 
			
		||||
  # perf trace -s syscall-counts.py
 | 
			
		||||
  # perf script -s syscall-counts.py
 | 
			
		||||
 | 
			
		||||
So those are the essential steps in writing and running a script.  The
 | 
			
		||||
process can be generalized to any tracepoint or set of tracepoints
 | 
			
		||||
| 
						 | 
				
			
			@ -324,17 +324,17 @@ interested in by looking at the list of available events shown by
 | 
			
		|||
'perf list' and/or look in /sys/kernel/debug/tracing events for
 | 
			
		||||
detailed event and field info, record the corresponding trace data
 | 
			
		||||
using 'perf record', passing it the list of interesting events,
 | 
			
		||||
generate a skeleton script using 'perf trace -g python' and modify the
 | 
			
		||||
generate a skeleton script using 'perf script -g python' and modify the
 | 
			
		||||
code to aggregate and display it for your particular needs.
 | 
			
		||||
 | 
			
		||||
After you've done that you may end up with a general-purpose script
 | 
			
		||||
that you want to keep around and have available for future use.  By
 | 
			
		||||
writing a couple of very simple shell scripts and putting them in the
 | 
			
		||||
right place, you can have your script listed alongside the other
 | 
			
		||||
scripts listed by the 'perf trace -l' command e.g.:
 | 
			
		||||
scripts listed by the 'perf script -l' command e.g.:
 | 
			
		||||
 | 
			
		||||
----
 | 
			
		||||
root@tropicana:~# perf trace -l
 | 
			
		||||
root@tropicana:~# perf script -l
 | 
			
		||||
List of available trace scripts:
 | 
			
		||||
  workqueue-stats                      workqueue stats (ins/exe/create/destroy)
 | 
			
		||||
  wakeup-latency                       system-wide min/max/avg wakeup latency
 | 
			
		||||
| 
						 | 
				
			
			@ -365,14 +365,14 @@ perf record -a -e raw_syscalls:sys_enter
 | 
			
		|||
The 'report' script is also a shell script with the same base name as
 | 
			
		||||
your script, but with -report appended.  It should also be located in
 | 
			
		||||
the perf/scripts/python/bin directory.  In that script, you write the
 | 
			
		||||
'perf trace -s' command-line needed for running your script:
 | 
			
		||||
'perf script -s' command-line needed for running your script:
 | 
			
		||||
 | 
			
		||||
----
 | 
			
		||||
# cat kernel-source/tools/perf/scripts/python/bin/syscall-counts-report
 | 
			
		||||
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
# description: system-wide syscall counts
 | 
			
		||||
perf trace -s ~/libexec/perf-core/scripts/python/syscall-counts.py
 | 
			
		||||
perf script -s ~/libexec/perf-core/scripts/python/syscall-counts.py
 | 
			
		||||
----
 | 
			
		||||
 | 
			
		||||
Note that the location of the Python script given in the shell script
 | 
			
		||||
| 
						 | 
				
			
			@ -390,17 +390,17 @@ total 32
 | 
			
		|||
drwxr-xr-x 4 trz trz 4096 2010-01-26 22:30 .
 | 
			
		||||
drwxr-xr-x 4 trz trz 4096 2010-01-26 22:29 ..
 | 
			
		||||
drwxr-xr-x 2 trz trz 4096 2010-01-26 22:29 bin
 | 
			
		||||
-rw-r--r-- 1 trz trz 2548 2010-01-26 22:29 check-perf-trace.py
 | 
			
		||||
drwxr-xr-x 3 trz trz 4096 2010-01-26 22:49 Perf-Trace-Util
 | 
			
		||||
-rw-r--r-- 1 trz trz 2548 2010-01-26 22:29 check-perf-script.py
 | 
			
		||||
drwxr-xr-x 3 trz trz 4096 2010-01-26 22:49 perf-script-Util
 | 
			
		||||
-rw-r--r-- 1 trz trz 1462 2010-01-26 22:30 syscall-counts.py
 | 
			
		||||
----
 | 
			
		||||
 | 
			
		||||
Once you've done that (don't forget to do a new 'make install',
 | 
			
		||||
otherwise your script won't show up at run-time), 'perf trace -l'
 | 
			
		||||
otherwise your script won't show up at run-time), 'perf script -l'
 | 
			
		||||
should show a new entry for your script:
 | 
			
		||||
 | 
			
		||||
----
 | 
			
		||||
root@tropicana:~# perf trace -l
 | 
			
		||||
root@tropicana:~# perf script -l
 | 
			
		||||
List of available trace scripts:
 | 
			
		||||
  workqueue-stats                      workqueue stats (ins/exe/create/destroy)
 | 
			
		||||
  wakeup-latency                       system-wide min/max/avg wakeup latency
 | 
			
		||||
| 
						 | 
				
			
			@ -409,19 +409,19 @@ List of available trace scripts:
 | 
			
		|||
  syscall-counts                       system-wide syscall counts
 | 
			
		||||
----
 | 
			
		||||
 | 
			
		||||
You can now perform the record step via 'perf trace record':
 | 
			
		||||
You can now perform the record step via 'perf script record':
 | 
			
		||||
 | 
			
		||||
  # perf trace record syscall-counts
 | 
			
		||||
  # perf script record syscall-counts
 | 
			
		||||
 | 
			
		||||
and display the output using 'perf trace report':
 | 
			
		||||
and display the output using 'perf script report':
 | 
			
		||||
 | 
			
		||||
  # perf trace report syscall-counts
 | 
			
		||||
  # perf script report syscall-counts
 | 
			
		||||
 | 
			
		||||
STARTER SCRIPTS
 | 
			
		||||
---------------
 | 
			
		||||
 | 
			
		||||
You can quickly get started writing a script for a particular set of
 | 
			
		||||
trace data by generating a skeleton script using 'perf trace -g
 | 
			
		||||
trace data by generating a skeleton script using 'perf script -g
 | 
			
		||||
python' in the same directory as an existing perf.data trace file.
 | 
			
		||||
That will generate a starter script containing a handler for each of
 | 
			
		||||
the event types in the trace file; it simply prints every available
 | 
			
		||||
| 
						 | 
				
			
			@ -430,13 +430,13 @@ field for each event in the trace file.
 | 
			
		|||
You can also look at the existing scripts in
 | 
			
		||||
~/libexec/perf-core/scripts/python for typical examples showing how to
 | 
			
		||||
do basic things like aggregate event data, print results, etc.  Also,
 | 
			
		||||
the check-perf-trace.py script, while not interesting for its results,
 | 
			
		||||
the check-perf-script.py script, while not interesting for its results,
 | 
			
		||||
attempts to exercise all of the main scripting features.
 | 
			
		||||
 | 
			
		||||
EVENT HANDLERS
 | 
			
		||||
--------------
 | 
			
		||||
 | 
			
		||||
When perf trace is invoked using a trace script, a user-defined
 | 
			
		||||
When perf script is invoked using a trace script, a user-defined
 | 
			
		||||
'handler function' is called for each event in the trace.  If there's
 | 
			
		||||
no handler function defined for a given event type, the event is
 | 
			
		||||
ignored (or passed to a 'trace_handled' function, see below) and the
 | 
			
		||||
| 
						 | 
				
			
			@ -510,7 +510,7 @@ write a useful trace script.  The sections below cover the rest.
 | 
			
		|||
SCRIPT LAYOUT
 | 
			
		||||
-------------
 | 
			
		||||
 | 
			
		||||
Every perf trace Python script should start by setting up a Python
 | 
			
		||||
Every perf script Python script should start by setting up a Python
 | 
			
		||||
module search path and 'import'ing a few support modules (see module
 | 
			
		||||
descriptions below):
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -519,7 +519,7 @@ descriptions below):
 | 
			
		|||
 import sys
 | 
			
		||||
 | 
			
		||||
 sys.path.append(os.environ['PERF_EXEC_PATH'] + \
 | 
			
		||||
	      '/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
 | 
			
		||||
	      '/scripts/python/perf-script-Util/lib/Perf/Trace')
 | 
			
		||||
 | 
			
		||||
 from perf_trace_context import *
 | 
			
		||||
 from Core import *
 | 
			
		||||
| 
						 | 
				
			
			@ -559,15 +559,15 @@ def trace_unhandled(event_name, context, common_cpu, common_secs,
 | 
			
		|||
----
 | 
			
		||||
 | 
			
		||||
The remaining sections provide descriptions of each of the available
 | 
			
		||||
built-in perf trace Python modules and their associated functions.
 | 
			
		||||
built-in perf script Python modules and their associated functions.
 | 
			
		||||
 | 
			
		||||
AVAILABLE MODULES AND FUNCTIONS
 | 
			
		||||
-------------------------------
 | 
			
		||||
 | 
			
		||||
The following sections describe the functions and variables available
 | 
			
		||||
via the various perf trace Python modules.  To use the functions and
 | 
			
		||||
via the various perf script Python modules.  To use the functions and
 | 
			
		||||
variables from the given module, add the corresponding 'from XXXX
 | 
			
		||||
import' line to your perf trace script.
 | 
			
		||||
import' line to your perf script script.
 | 
			
		||||
 | 
			
		||||
Core.py Module
 | 
			
		||||
~~~~~~~~~~~~~~
 | 
			
		||||
| 
						 | 
				
			
			@ -610,7 +610,7 @@ argument.
 | 
			
		|||
Util.py Module
 | 
			
		||||
~~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
Various utility functions for use with perf trace:
 | 
			
		||||
Various utility functions for use with perf script:
 | 
			
		||||
 | 
			
		||||
  nsecs(secs, nsecs) - returns total nsecs given secs/nsecs pair
 | 
			
		||||
  nsecs_secs(nsecs) - returns whole secs portion given nsecs
 | 
			
		||||
| 
						 | 
				
			
			@ -620,4 +620,4 @@ Various utility functions for use with perf trace:
 | 
			
		|||
 | 
			
		||||
SEE ALSO
 | 
			
		||||
--------
 | 
			
		||||
linkperf:perf-trace[1]
 | 
			
		||||
linkperf:perf-script[1]
 | 
			
		||||
| 
						 | 
				
			
			@ -1,71 +1,71 @@
 | 
			
		|||
perf-trace(1)
 | 
			
		||||
perf-script(1)
 | 
			
		||||
=============
 | 
			
		||||
 | 
			
		||||
NAME
 | 
			
		||||
----
 | 
			
		||||
perf-trace - Read perf.data (created by perf record) and display trace output
 | 
			
		||||
perf-script - Read perf.data (created by perf record) and display trace output
 | 
			
		||||
 | 
			
		||||
SYNOPSIS
 | 
			
		||||
--------
 | 
			
		||||
[verse]
 | 
			
		||||
'perf trace' [<options>]
 | 
			
		||||
'perf trace' [<options>] record <script> [<record-options>] <command>
 | 
			
		||||
'perf trace' [<options>] report <script> [script-args]
 | 
			
		||||
'perf trace' [<options>] <script> <required-script-args> [<record-options>] <command>
 | 
			
		||||
'perf trace' [<options>] <top-script> [script-args]
 | 
			
		||||
'perf script' [<options>]
 | 
			
		||||
'perf script' [<options>] record <script> [<record-options>] <command>
 | 
			
		||||
'perf script' [<options>] report <script> [script-args]
 | 
			
		||||
'perf script' [<options>] <script> <required-script-args> [<record-options>] <command>
 | 
			
		||||
'perf script' [<options>] <top-script> [script-args]
 | 
			
		||||
 | 
			
		||||
DESCRIPTION
 | 
			
		||||
-----------
 | 
			
		||||
This command reads the input file and displays the trace recorded.
 | 
			
		||||
 | 
			
		||||
There are several variants of perf trace:
 | 
			
		||||
There are several variants of perf script:
 | 
			
		||||
 | 
			
		||||
  'perf trace' to see a detailed trace of the workload that was
 | 
			
		||||
  'perf script' to see a detailed trace of the workload that was
 | 
			
		||||
  recorded.
 | 
			
		||||
 | 
			
		||||
  You can also run a set of pre-canned scripts that aggregate and
 | 
			
		||||
  summarize the raw trace data in various ways (the list of scripts is
 | 
			
		||||
  available via 'perf trace -l').  The following variants allow you to
 | 
			
		||||
  available via 'perf script -l').  The following variants allow you to
 | 
			
		||||
  record and run those scripts:
 | 
			
		||||
 | 
			
		||||
  'perf trace record <script> <command>' to record the events required
 | 
			
		||||
  for 'perf trace report'.  <script> is the name displayed in the
 | 
			
		||||
  output of 'perf trace --list' i.e. the actual script name minus any
 | 
			
		||||
  'perf script record <script> <command>' to record the events required
 | 
			
		||||
  for 'perf script report'.  <script> is the name displayed in the
 | 
			
		||||
  output of 'perf script --list' i.e. the actual script name minus any
 | 
			
		||||
  language extension.  If <command> is not specified, the events are
 | 
			
		||||
  recorded using the -a (system-wide) 'perf record' option.
 | 
			
		||||
 | 
			
		||||
  'perf trace report <script> [args]' to run and display the results
 | 
			
		||||
  'perf script report <script> [args]' to run and display the results
 | 
			
		||||
  of <script>.  <script> is the name displayed in the output of 'perf
 | 
			
		||||
  trace --list' i.e. the actual script name minus any language
 | 
			
		||||
  extension.  The perf.data output from a previous run of 'perf trace
 | 
			
		||||
  extension.  The perf.data output from a previous run of 'perf script
 | 
			
		||||
  record <script>' is used and should be present for this command to
 | 
			
		||||
  succeed.  [args] refers to the (mainly optional) args expected by
 | 
			
		||||
  the script.
 | 
			
		||||
 | 
			
		||||
  'perf trace <script> <required-script-args> <command>' to both
 | 
			
		||||
  'perf script <script> <required-script-args> <command>' to both
 | 
			
		||||
  record the events required for <script> and to run the <script>
 | 
			
		||||
  using 'live-mode' i.e. without writing anything to disk.  <script>
 | 
			
		||||
  is the name displayed in the output of 'perf trace --list' i.e. the
 | 
			
		||||
  is the name displayed in the output of 'perf script --list' i.e. the
 | 
			
		||||
  actual script name minus any language extension.  If <command> is
 | 
			
		||||
  not specified, the events are recorded using the -a (system-wide)
 | 
			
		||||
  'perf record' option.  If <script> has any required args, they
 | 
			
		||||
  should be specified before <command>.  This mode doesn't allow for
 | 
			
		||||
  optional script args to be specified; if optional script args are
 | 
			
		||||
  desired, they can be specified using separate 'perf trace record'
 | 
			
		||||
  and 'perf trace report' commands, with the stdout of the record step
 | 
			
		||||
  desired, they can be specified using separate 'perf script record'
 | 
			
		||||
  and 'perf script report' commands, with the stdout of the record step
 | 
			
		||||
  piped to the stdin of the report script, using the '-o -' and '-i -'
 | 
			
		||||
  options of the corresponding commands.
 | 
			
		||||
 | 
			
		||||
  'perf trace <top-script>' to both record the events required for
 | 
			
		||||
  'perf script <top-script>' to both record the events required for
 | 
			
		||||
  <top-script> and to run the <top-script> using 'live-mode'
 | 
			
		||||
  i.e. without writing anything to disk.  <top-script> is the name
 | 
			
		||||
  displayed in the output of 'perf trace --list' i.e. the actual
 | 
			
		||||
  displayed in the output of 'perf script --list' i.e. the actual
 | 
			
		||||
  script name minus any language extension; a <top-script> is defined
 | 
			
		||||
  as any script name ending with the string 'top'.
 | 
			
		||||
 | 
			
		||||
  [<record-options>] can be passed to the record steps of 'perf trace
 | 
			
		||||
  [<record-options>] can be passed to the record steps of 'perf script
 | 
			
		||||
  record' and 'live-mode' variants; this isn't possible however for
 | 
			
		||||
  <top-script> 'live-mode' or 'perf trace report' variants.
 | 
			
		||||
  <top-script> 'live-mode' or 'perf script report' variants.
 | 
			
		||||
 | 
			
		||||
  See the 'SEE ALSO' section for links to language-specific
 | 
			
		||||
  information on how to write and run your own trace scripts.
 | 
			
		||||
| 
						 | 
				
			
			@ -76,7 +76,7 @@ OPTIONS
 | 
			
		|||
	Any command you can specify in a shell.
 | 
			
		||||
 | 
			
		||||
-D::
 | 
			
		||||
--dump-raw-trace=::
 | 
			
		||||
--dump-raw-script=::
 | 
			
		||||
        Display verbose dump of the trace data.
 | 
			
		||||
 | 
			
		||||
-L::
 | 
			
		||||
| 
						 | 
				
			
			@ -95,7 +95,7 @@ OPTIONS
 | 
			
		|||
 | 
			
		||||
-g::
 | 
			
		||||
--gen-script=::
 | 
			
		||||
        Generate perf-trace.[ext] starter script for given language,
 | 
			
		||||
        Generate perf-script.[ext] starter script for given language,
 | 
			
		||||
        using current perf.data.
 | 
			
		||||
 | 
			
		||||
-a::
 | 
			
		||||
| 
						 | 
				
			
			@ -107,5 +107,5 @@ OPTIONS
 | 
			
		|||
 | 
			
		||||
SEE ALSO
 | 
			
		||||
--------
 | 
			
		||||
linkperf:perf-record[1], linkperf:perf-trace-perl[1],
 | 
			
		||||
linkperf:perf-trace-python[1]
 | 
			
		||||
linkperf:perf-record[1], linkperf:perf-script-perl[1],
 | 
			
		||||
linkperf:perf-script-python[1]
 | 
			
		||||
| 
						 | 
				
			
			@ -485,7 +485,7 @@ BUILTIN_OBJS += $(OUTPUT)builtin-report.o
 | 
			
		|||
BUILTIN_OBJS += $(OUTPUT)builtin-stat.o
 | 
			
		||||
BUILTIN_OBJS += $(OUTPUT)builtin-timechart.o
 | 
			
		||||
BUILTIN_OBJS += $(OUTPUT)builtin-top.o
 | 
			
		||||
BUILTIN_OBJS += $(OUTPUT)builtin-trace.o
 | 
			
		||||
BUILTIN_OBJS += $(OUTPUT)builtin-script.o
 | 
			
		||||
BUILTIN_OBJS += $(OUTPUT)builtin-probe.o
 | 
			
		||||
BUILTIN_OBJS += $(OUTPUT)builtin-kmem.o
 | 
			
		||||
BUILTIN_OBJS += $(OUTPUT)builtin-lock.o
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -982,9 +982,9 @@ int cmd_lock(int argc, const char **argv, const char *prefix __used)
 | 
			
		|||
				usage_with_options(report_usage, report_options);
 | 
			
		||||
		}
 | 
			
		||||
		__cmd_report();
 | 
			
		||||
	} else if (!strcmp(argv[0], "trace")) {
 | 
			
		||||
		/* Aliased to 'perf trace' */
 | 
			
		||||
		return cmd_trace(argc, argv, prefix);
 | 
			
		||||
	} else if (!strcmp(argv[0], "script")) {
 | 
			
		||||
		/* Aliased to 'perf script' */
 | 
			
		||||
		return cmd_script(argc, argv, prefix);
 | 
			
		||||
	} else if (!strcmp(argv[0], "info")) {
 | 
			
		||||
		if (argc) {
 | 
			
		||||
			argc = parse_options(argc, argv,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1888,10 +1888,10 @@ int cmd_sched(int argc, const char **argv, const char *prefix __used)
 | 
			
		|||
		usage_with_options(sched_usage, sched_options);
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Aliased to 'perf trace' for now:
 | 
			
		||||
	 * Aliased to 'perf script' for now:
 | 
			
		||||
	 */
 | 
			
		||||
	if (!strcmp(argv[0], "trace"))
 | 
			
		||||
		return cmd_trace(argc, argv, prefix);
 | 
			
		||||
	if (!strcmp(argv[0], "script"))
 | 
			
		||||
		return cmd_script(argc, argv, prefix);
 | 
			
		||||
 | 
			
		||||
	symbol__init();
 | 
			
		||||
	if (!strncmp(argv[0], "rec", 3)) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -56,7 +56,7 @@ static void setup_scripting(void)
 | 
			
		|||
 | 
			
		||||
static int cleanup_scripting(void)
 | 
			
		||||
{
 | 
			
		||||
	pr_debug("\nperf trace script stopped\n");
 | 
			
		||||
	pr_debug("\nperf script stopped\n");
 | 
			
		||||
 | 
			
		||||
	return scripting_ops->stop_script();
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -137,7 +137,7 @@ static void sig_handler(int sig __unused)
 | 
			
		|||
	session_done = 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int __cmd_trace(struct perf_session *session)
 | 
			
		||||
static int __cmd_script(struct perf_session *session)
 | 
			
		||||
{
 | 
			
		||||
	int ret;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -247,7 +247,7 @@ static void list_available_languages(void)
 | 
			
		|||
 | 
			
		||||
	fprintf(stderr, "\n");
 | 
			
		||||
	fprintf(stderr, "Scripting language extensions (used in "
 | 
			
		||||
		"perf trace -s [spec:]script.[spec]):\n\n");
 | 
			
		||||
		"perf script -s [spec:]script.[spec]):\n\n");
 | 
			
		||||
 | 
			
		||||
	list_for_each_entry(s, &script_specs, node)
 | 
			
		||||
		fprintf(stderr, "  %-42s [%s]\n", s->spec, s->ops->name);
 | 
			
		||||
| 
						 | 
				
			
			@ -569,12 +569,12 @@ static int has_required_arg(char *script_path)
 | 
			
		|||
	return n_args;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static const char * const trace_usage[] = {
 | 
			
		||||
	"perf trace [<options>]",
 | 
			
		||||
	"perf trace [<options>] record <script> [<record-options>] <command>",
 | 
			
		||||
	"perf trace [<options>] report <script> [script-args]",
 | 
			
		||||
	"perf trace [<options>] <script> [<record-options>] <command>",
 | 
			
		||||
	"perf trace [<options>] <top-script> [script-args]",
 | 
			
		||||
static const char * const script_usage[] = {
 | 
			
		||||
	"perf script [<options>]",
 | 
			
		||||
	"perf script [<options>] record <script> [<record-options>] <command>",
 | 
			
		||||
	"perf script [<options>] report <script> [script-args]",
 | 
			
		||||
	"perf script [<options>] <script> [<record-options>] <command>",
 | 
			
		||||
	"perf script [<options>] <top-script> [script-args]",
 | 
			
		||||
	NULL
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -591,7 +591,7 @@ static const struct option options[] = {
 | 
			
		|||
		     "script file name (lang:script name, script name, or *)",
 | 
			
		||||
		     parse_scriptname),
 | 
			
		||||
	OPT_STRING('g', "gen-script", &generate_script_lang, "lang",
 | 
			
		||||
		   "generate perf-trace.xx script in specified language"),
 | 
			
		||||
		   "generate perf-script.xx script in specified language"),
 | 
			
		||||
	OPT_STRING('i', "input", &input_name, "file",
 | 
			
		||||
		    "input file name"),
 | 
			
		||||
	OPT_BOOLEAN('d', "debug-mode", &debug_mode,
 | 
			
		||||
| 
						 | 
				
			
			@ -614,7 +614,7 @@ static bool have_cmd(int argc, const char **argv)
 | 
			
		|||
	return argc != 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int cmd_trace(int argc, const char **argv, const char *prefix __used)
 | 
			
		||||
int cmd_script(int argc, const char **argv, const char *prefix __used)
 | 
			
		||||
{
 | 
			
		||||
	char *rec_script_path = NULL;
 | 
			
		||||
	char *rep_script_path = NULL;
 | 
			
		||||
| 
						 | 
				
			
			@ -626,7 +626,7 @@ int cmd_trace(int argc, const char **argv, const char *prefix __used)
 | 
			
		|||
 | 
			
		||||
	setup_scripting();
 | 
			
		||||
 | 
			
		||||
	argc = parse_options(argc, argv, options, trace_usage,
 | 
			
		||||
	argc = parse_options(argc, argv, options, script_usage,
 | 
			
		||||
			     PARSE_OPT_STOP_AT_NON_OPTION);
 | 
			
		||||
 | 
			
		||||
	if (argc > 1 && !strncmp(argv[0], "rec", strlen("rec"))) {
 | 
			
		||||
| 
						 | 
				
			
			@ -640,7 +640,7 @@ int cmd_trace(int argc, const char **argv, const char *prefix __used)
 | 
			
		|||
		if (!rep_script_path) {
 | 
			
		||||
			fprintf(stderr,
 | 
			
		||||
				"Please specify a valid report script"
 | 
			
		||||
				"(see 'perf trace -l' for listing)\n");
 | 
			
		||||
				"(see 'perf script -l' for listing)\n");
 | 
			
		||||
			return -1;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -658,8 +658,8 @@ int cmd_trace(int argc, const char **argv, const char *prefix __used)
 | 
			
		|||
 | 
			
		||||
		if (!rec_script_path && !rep_script_path) {
 | 
			
		||||
			fprintf(stderr, " Couldn't find script %s\n\n See perf"
 | 
			
		||||
				" trace -l for available scripts.\n", argv[0]);
 | 
			
		||||
			usage_with_options(trace_usage, options);
 | 
			
		||||
				" script -l for available scripts.\n", argv[0]);
 | 
			
		||||
			usage_with_options(script_usage, options);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (is_top_script(argv[0])) {
 | 
			
		||||
| 
						 | 
				
			
			@ -671,9 +671,9 @@ int cmd_trace(int argc, const char **argv, const char *prefix __used)
 | 
			
		|||
			rec_args = (argc - 1) - rep_args;
 | 
			
		||||
			if (rec_args < 0) {
 | 
			
		||||
				fprintf(stderr, " %s script requires options."
 | 
			
		||||
					"\n\n See perf trace -l for available "
 | 
			
		||||
					"\n\n See perf script -l for available "
 | 
			
		||||
					"scripts and options.\n", argv[0]);
 | 
			
		||||
				usage_with_options(trace_usage, options);
 | 
			
		||||
				usage_with_options(script_usage, options);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -806,7 +806,7 @@ int cmd_trace(int argc, const char **argv, const char *prefix __used)
 | 
			
		|||
			return -1;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		err = scripting_ops->generate_script("perf-trace");
 | 
			
		||||
		err = scripting_ops->generate_script("perf-script");
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -814,10 +814,10 @@ int cmd_trace(int argc, const char **argv, const char *prefix __used)
 | 
			
		|||
		err = scripting_ops->start_script(script_name, argc, argv);
 | 
			
		||||
		if (err)
 | 
			
		||||
			goto out;
 | 
			
		||||
		pr_debug("perf trace started with script %s\n\n", script_name);
 | 
			
		||||
		pr_debug("perf script started with script %s\n\n", script_name);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err = __cmd_trace(session);
 | 
			
		||||
	err = __cmd_script(session);
 | 
			
		||||
 | 
			
		||||
	perf_session__delete(session);
 | 
			
		||||
	cleanup_scripting();
 | 
			
		||||
| 
						 | 
				
			
			@ -27,7 +27,7 @@ extern int cmd_report(int argc, const char **argv, const char *prefix);
 | 
			
		|||
extern int cmd_stat(int argc, const char **argv, const char *prefix);
 | 
			
		||||
extern int cmd_timechart(int argc, const char **argv, const char *prefix);
 | 
			
		||||
extern int cmd_top(int argc, const char **argv, const char *prefix);
 | 
			
		||||
extern int cmd_trace(int argc, const char **argv, const char *prefix);
 | 
			
		||||
extern int cmd_script(int argc, const char **argv, const char *prefix);
 | 
			
		||||
extern int cmd_version(int argc, const char **argv, const char *prefix);
 | 
			
		||||
extern int cmd_probe(int argc, const char **argv, const char *prefix);
 | 
			
		||||
extern int cmd_kmem(int argc, const char **argv, const char *prefix);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -323,7 +323,7 @@ static void handle_internal_command(int argc, const char **argv)
 | 
			
		|||
		{ "top",	cmd_top,	0 },
 | 
			
		||||
		{ "annotate",	cmd_annotate,	0 },
 | 
			
		||||
		{ "version",	cmd_version,	0 },
 | 
			
		||||
		{ "trace",	cmd_trace,	0 },
 | 
			
		||||
		{ "script",	cmd_script,	0 },
 | 
			
		||||
		{ "sched",	cmd_sched,	0 },
 | 
			
		||||
		{ "probe",	cmd_probe,	0 },
 | 
			
		||||
		{ "kmem",	cmd_kmem,	0 },
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Context.c.  Python interfaces for perf trace.
 | 
			
		||||
 * Context.c.  Python interfaces for perf script.
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2010 Tom Zanussi <tzanussi@gmail.com>
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
/*
 | 
			
		||||
 * trace-event-perl.  Feed perf trace events to an embedded Perl interpreter.
 | 
			
		||||
 * trace-event-perl.  Feed perf script events to an embedded Perl interpreter.
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2009 Tom Zanussi <tzanussi@gmail.com>
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			@ -411,8 +411,8 @@ static int perl_generate_script(const char *outfile)
 | 
			
		|||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fprintf(ofp, "# perf trace event handlers, "
 | 
			
		||||
		"generated by perf trace -g perl\n");
 | 
			
		||||
	fprintf(ofp, "# perf script event handlers, "
 | 
			
		||||
		"generated by perf script -g perl\n");
 | 
			
		||||
 | 
			
		||||
	fprintf(ofp, "# Licensed under the terms of the GNU GPL"
 | 
			
		||||
		" License version 2\n\n");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -442,8 +442,8 @@ static int python_generate_script(const char *outfile)
 | 
			
		|||
		fprintf(stderr, "couldn't open %s\n", fname);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
	fprintf(ofp, "# perf trace event handlers, "
 | 
			
		||||
		"generated by perf trace -g python\n");
 | 
			
		||||
	fprintf(ofp, "# perf script event handlers, "
 | 
			
		||||
		"generated by perf script -g python\n");
 | 
			
		||||
 | 
			
		||||
	fprintf(ofp, "# Licensed under the terms of the GNU GPL"
 | 
			
		||||
		" License version 2\n\n");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue