| perf-script(1) |
| ============= |
| |
| NAME |
| ---- |
| perf-script - Read perf.data (created by perf record) and display trace output |
| |
| SYNOPSIS |
| -------- |
| [verse] |
| '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 script: |
| |
| '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 script -l'). The following variants allow you to |
| record and run those scripts: |
| |
| '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 script report <script> [args]' to run and display the results |
| of <script>. <script> is the name displayed in the output of 'perf |
| script --list' i.e. the actual script name minus any language |
| 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 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 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 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 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 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 script |
| record' and 'live-mode' variants; this isn't possible however for |
| <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. |
| |
| OPTIONS |
| ------- |
| <command>...:: |
| Any command you can specify in a shell. |
| |
| -D:: |
| --dump-raw-trace=:: |
| Display verbose dump of the trace data. |
| |
| --dump-unsorted-raw-trace=:: |
| Same as --dump-raw-trace but not sorted in time order. |
| |
| -L:: |
| --Latency=:: |
| Show latency attributes (irqs/preemption disabled, etc). |
| |
| -l:: |
| --list=:: |
| Display a list of available trace scripts. |
| |
| -s ['lang']:: |
| --script=:: |
| Process trace data with the given script ([lang]:script[.ext]). |
| If the string 'lang' is specified in place of a script name, a |
| list of supported languages will be displayed instead. |
| |
| -g:: |
| --gen-script=:: |
| Generate perf-script.[ext] starter script for given language, |
| using current perf.data. |
| |
| --dlfilter=<file>:: |
| Filter sample events using the given shared object file. |
| Refer linkperf:perf-dlfilter[1] |
| |
| --dlarg=<arg>:: |
| Pass 'arg' as an argument to the dlfilter. --dlarg may be repeated |
| to add more arguments. |
| |
| --list-dlfilters:: |
| Display a list of available dlfilters. Use with option -v (must come |
| before option --list-dlfilters) to show long descriptions. |
| |
| -a:: |
| Force system-wide collection. Scripts run without a <command> |
| normally use -a by default, while scripts run with a <command> |
| normally don't - this option allows the latter to be run in |
| system-wide mode. |
| |
| -i:: |
| --input=:: |
| Input file name. (default: perf.data unless stdin is a fifo) |
| |
| -d:: |
| --debug-mode:: |
| Do various checks like samples ordering and lost events. |
| |
| -F:: |
| --fields:: |
| Comma separated list of fields to print. Options are: |
| comm, tid, pid, time, cpu, event, trace, ip, sym, dso, dsoff, addr, symoff, |
| srcline, period, iregs, uregs, brstack, brstacksym, flags, bpf-output, |
| brstackinsn, brstackinsnlen, brstackdisasm, brstackoff, callindent, insn, disasm, |
| insnlen, synth, phys_addr, metric, misc, srccode, ipc, data_page_size, |
| code_page_size, ins_lat, machine_pid, vcpu, cgroup, retire_lat, brcntr, |
| |
| Field list can be prepended with the type, trace, sw or hw, |
| to indicate to which event type the field list applies. |
| e.g., -F sw:comm,tid,time,ip,sym and -F trace:time,cpu,trace |
| |
| perf script -F <fields> |
| |
| is equivalent to: |
| |
| perf script -F trace:<fields> -F sw:<fields> -F hw:<fields> |
| |
| i.e., the specified fields apply to all event types if the type string |
| is not given. |
| |
| In addition to overriding fields, it is also possible to add or remove |
| fields from the defaults. For example |
| |
| -F -cpu,+insn |
| |
| removes the cpu field and adds the insn field. Adding/removing fields |
| cannot be mixed with normal overriding. |
| |
| The arguments are processed in the order received. A later usage can |
| reset a prior request. e.g.: |
| |
| -F trace: -F comm,tid,time,ip,sym |
| |
| The first -F suppresses trace events (field list is ""), but then the |
| second invocation sets the fields to comm,tid,time,ip,sym. In this case a |
| warning is given to the user: |
| |
| "Overriding previous field request for all events." |
| |
| Alternatively, consider the order: |
| |
| -F comm,tid,time,ip,sym -F trace: |
| |
| The first -F sets the fields for all events and the second -F |
| suppresses trace events. The user is given a warning message about |
| the override, and the result of the above is that only S/W and H/W |
| events are displayed with the given fields. |
| |
| It's possible tp add/remove fields only for specific event type: |
| |
| -Fsw:-cpu,-period |
| |
| removes cpu and period from software events. |
| |
| For the 'wildcard' option if a user selected field is invalid for an |
| event type, a message is displayed to the user that the option is |
| ignored for that type. For example: |
| |
| $ perf script -F comm,tid,trace |
| 'trace' not valid for hardware events. Ignoring. |
| 'trace' not valid for software events. Ignoring. |
| |
| Alternatively, if the type is given an invalid field is specified it |
| is an error. For example: |
| |
| perf script -v -F sw:comm,tid,trace |
| 'trace' not valid for software events. |
| |
| At this point usage is displayed, and perf-script exits. |
| |
| The flags field is synthesized and may have a value when Instruction |
| Trace decoding. The flags are "bcrosyiABExghDt" which stand for branch, |
| call, return, conditional, system, asynchronous, interrupt, |
| transaction abort, trace begin, trace end, in transaction, VM-Entry, |
| VM-Exit, interrupt disabled and interrupt disable toggle respectively. |
| Known combinations of flags are printed more nicely e.g. |
| "call" for "bc", "return" for "br", "jcc" for "bo", "jmp" for "b", |
| "int" for "bci", "iret" for "bri", "syscall" for "bcs", "sysret" for "brs", |
| "async" for "by", "hw int" for "bcyi", "tx abrt" for "bA", "tr strt" for "bB", |
| "tr end" for "bE", "vmentry" for "bcg", "vmexit" for "bch". |
| However the "x", "D" and "t" flags will be displayed separately in those |
| cases e.g. "jcc (xD)" for a condition branch within a transaction |
| with interrupts disabled. Note, interrupts becoming disabled is "t", |
| whereas interrupts becoming enabled is "Dt". |
| |
| The callindent field is synthesized and may have a value when |
| Instruction Trace decoding. For calls and returns, it will display the |
| name of the symbol indented with spaces to reflect the stack depth. |
| |
| When doing instruction trace decoding, insn, disasm and insnlen give the |
| instruction bytes, disassembled instructions (requires libcapstone support) |
| and the instruction length of the current instruction respectively. |
| |
| The synth field is used by synthesized events which may be created when |
| Instruction Trace decoding. |
| |
| The ipc (instructions per cycle) field is synthesized and may have a value when |
| Instruction Trace decoding. |
| |
| The machine_pid and vcpu fields are derived from data resulting from using |
| perf inject to insert a perf.data file recorded inside a virtual machine into |
| a perf.data file recorded on the host at the same time. |
| |
| The cgroup fields requires sample having the cgroup id which is saved |
| when "--all-cgroups" option is passed to 'perf record'. |
| |
| Finally, a user may not set fields to none for all event types. |
| i.e., -F "" is not allowed. |
| |
| The brstack output includes branch related information with raw addresses using the |
| /v/v/v/v/cycles syntax in the following order: |
| FROM: branch source instruction |
| TO : branch target instruction |
| M/P/-: M=branch target mispredicted or branch direction was mispredicted, P=target predicted or direction predicted, -=not supported |
| X/- : X=branch inside a transactional region, -=not in transaction region or not supported |
| A/- : A=TSX abort entry, -=not aborted region or not supported |
| cycles |
| |
| The brstacksym is identical to brstack, except that the FROM and TO addresses are printed in a symbolic form if possible. |
| |
| When brstackinsn is specified the full assembler sequences of branch sequences for each sample |
| is printed. This is the full execution path leading to the sample. This is only supported when the |
| sample was recorded with perf record -b or -j any. |
| |
| Use brstackinsnlen to print the brstackinsn lenght. For example, you |
| can’t know the next sequential instruction after an unconditional branch unless |
| you calculate that based on its length. |
| |
| brstackdisasm acts like brstackinsn, but will print disassembled instructions if |
| perf is built with the capstone library. |
| |
| The brstackoff field will print an offset into a specific dso/binary. |
| |
| With the metric option perf script can compute metrics for |
| sampling periods, similar to perf stat. This requires |
| specifying a group with multiple events defining metrics with the :S option |
| for perf record. perf will sample on the first event, and |
| print computed metrics for all the events in the group. Please note |
| that the metric computed is averaged over the whole sampling |
| period (since the last sample), not just for the sample point. |
| |
| For sample events it's possible to display misc field with -F +misc option, |
| following letters are displayed for each bit: |
| |
| PERF_RECORD_MISC_KERNEL K |
| PERF_RECORD_MISC_USER U |
| PERF_RECORD_MISC_HYPERVISOR H |
| PERF_RECORD_MISC_GUEST_KERNEL G |
| PERF_RECORD_MISC_GUEST_USER g |
| PERF_RECORD_MISC_MMAP_DATA* M |
| PERF_RECORD_MISC_COMM_EXEC E |
| PERF_RECORD_MISC_SWITCH_OUT S |
| PERF_RECORD_MISC_SWITCH_OUT_PREEMPT Sp |
| |
| $ perf script -F +misc ... |
| sched-messaging 1414 K 28690.636582: 4590 cycles ... |
| sched-messaging 1407 U 28690.636600: 325620 cycles ... |
| sched-messaging 1414 K 28690.636608: 19473 cycles ... |
| misc field ___________/ |
| |
| -k:: |
| --vmlinux=<file>:: |
| vmlinux pathname |
| |
| --kallsyms=<file>:: |
| kallsyms pathname |
| |
| --symfs=<directory>:: |
| Look for files with symbols relative to this directory. |
| |
| -G:: |
| --hide-call-graph:: |
| When printing symbols do not display call chain. |
| |
| --stop-bt:: |
| Stop display of callgraph at these symbols |
| |
| -C:: |
| --cpu:: Only report samples for the list of CPUs provided. Multiple CPUs can |
| be provided as a comma-separated list with no space: 0,1. Ranges of |
| CPUs are specified with -: 0-2. Default is to report samples on all |
| CPUs. |
| |
| -c:: |
| --comms=:: |
| Only display events for these comms. CSV that understands |
| file://filename entries. |
| |
| --pid=:: |
| Only show events for given process ID (comma separated list). |
| |
| --tid=:: |
| Only show events for given thread ID (comma separated list). |
| |
| -I:: |
| --show-info:: |
| Display extended information about the perf.data file. This adds |
| information which may be very large and thus may clutter the display. |
| It currently includes: cpu and numa topology of the host system. |
| It can only be used with the perf script report mode. |
| |
| --show-kernel-path:: |
| Try to resolve the path of [kernel.kallsyms] |
| |
| --show-task-events |
| Display task related events (e.g. FORK, COMM, EXIT). |
| |
| --show-mmap-events |
| Display mmap related events (e.g. MMAP, MMAP2). |
| |
| --show-namespace-events |
| Display namespace events i.e. events of type PERF_RECORD_NAMESPACES. |
| |
| --show-switch-events |
| Display context switch events i.e. events of type PERF_RECORD_SWITCH or |
| PERF_RECORD_SWITCH_CPU_WIDE. |
| |
| --show-lost-events |
| Display lost events i.e. events of type PERF_RECORD_LOST. |
| |
| --show-round-events |
| Display finished round events i.e. events of type PERF_RECORD_FINISHED_ROUND. |
| |
| --show-bpf-events |
| Display bpf events i.e. events of type PERF_RECORD_KSYMBOL and PERF_RECORD_BPF_EVENT. |
| |
| --show-cgroup-events |
| Display cgroup events i.e. events of type PERF_RECORD_CGROUP. |
| |
| --show-text-poke-events |
| Display text poke events i.e. events of type PERF_RECORD_TEXT_POKE and |
| PERF_RECORD_KSYMBOL. |
| |
| --demangle:: |
| Demangle symbol names to human readable form. It's enabled by default, |
| disable with --no-demangle. |
| |
| --demangle-kernel:: |
| Demangle kernel symbol names to human readable form (for C++ kernels). |
| |
| --addr2line=<path>:: |
| Path to addr2line binary. |
| |
| --header |
| Show perf.data header. |
| |
| --header-only |
| Show only perf.data header. |
| |
| --itrace:: |
| Options for decoding instruction tracing data. The options are: |
| |
| include::itrace.txt[] |
| |
| To disable decoding entirely, use --no-itrace. |
| |
| --full-source-path:: |
| Show the full path for source files for srcline output. |
| |
| --max-stack:: |
| Set the stack depth limit when parsing the callchain, anything |
| beyond the specified depth will be ignored. This is a trade-off |
| between information loss and faster processing especially for |
| workloads that can have a very long callchain stack. |
| Note that when using the --itrace option the synthesized callchain size |
| will override this value if the synthesized callchain size is bigger. |
| |
| Default: 127 |
| |
| --ns:: |
| Use 9 decimal places when displaying time (i.e. show the nanoseconds) |
| |
| -f:: |
| --force:: |
| Don't do ownership validation. |
| |
| --time:: |
| Only analyze samples within given time window: <start>,<stop>. Times |
| have the format seconds.nanoseconds. If start is not given (i.e. time |
| string is ',x.y') then analysis starts at the beginning of the file. If |
| stop time is not given (i.e. time string is 'x.y,') then analysis goes |
| to end of file. Multiple ranges can be separated by spaces, which |
| requires the argument to be quoted e.g. --time "1234.567,1234.789 1235," |
| |
| Also support time percent with multiple time ranges. Time string is |
| 'a%/n,b%/m,...' or 'a%-b%,c%-%d,...'. |
| |
| For example: |
| Select the second 10% time slice: |
| perf script --time 10%/2 |
| |
| Select from 0% to 10% time slice: |
| perf script --time 0%-10% |
| |
| Select the first and second 10% time slices: |
| perf script --time 10%/1,10%/2 |
| |
| Select from 0% to 10% and 30% to 40% slices: |
| perf script --time 0%-10%,30%-40% |
| |
| --max-blocks:: |
| Set the maximum number of program blocks to print with brstackinsn for |
| each sample. |
| |
| --reltime:: |
| Print time stamps relative to trace start. |
| |
| --deltatime:: |
| Print time stamps relative to previous event. |
| |
| --per-event-dump:: |
| Create per event files with a "perf.data.EVENT.dump" name instead of |
| printing to stdout, useful, for instance, for generating flamegraphs. |
| |
| --inline:: |
| If a callgraph address belongs to an inlined function, the inline stack |
| will be printed. Each entry has function name and file/line. Enabled by |
| default, disable with --no-inline. |
| |
| --insn-trace[=<raw|disasm>]:: |
| Show instruction stream in bytes (raw) or disassembled (disasm) |
| for intel_pt traces. The default is 'raw'. To use xed, combine |
| 'raw' with --xed to show disassembly done by xed. |
| |
| --xed:: |
| Run xed disassembler on output. Requires installing the xed disassembler. |
| |
| -S:: |
| --symbols=symbol[,symbol...]:: |
| Only consider the listed symbols. Symbols are typically a name |
| but they may also be hexadecimal address. |
| |
| The hexadecimal address may be the start address of a symbol or |
| any other address to filter the trace records |
| |
| For example, to select the symbol noploop or the address 0x4007a0: |
| perf script --symbols=noploop,0x4007a0 |
| |
| Support filtering trace records by symbol name, start address of |
| symbol, any hexadecimal address and address range. |
| |
| The comparison order is: |
| |
| 1. symbol name comparison |
| 2. symbol start address comparison. |
| 3. any hexadecimal address comparison. |
| 4. address range comparison (see --addr-range). |
| |
| --addr-range:: |
| Use with -S or --symbols to list traced records within address range. |
| |
| For example, to list the traced records within the address range |
| [0x4007a0, 0x0x4007a9]: |
| perf script -S 0x4007a0 --addr-range 10 |
| |
| --dsos=:: |
| Only consider symbols in these DSOs. |
| |
| --call-trace:: |
| Show call stream for intel_pt traces. The CPUs are interleaved, but |
| can be filtered with -C. |
| |
| --call-ret-trace:: |
| Show call and return stream for intel_pt traces. |
| |
| --graph-function:: |
| For itrace only show specified functions and their callees for |
| itrace. Multiple functions can be separated by comma. |
| |
| --switch-on EVENT_NAME:: |
| Only consider events after this event is found. |
| |
| --switch-off EVENT_NAME:: |
| Stop considering events after this event is found. |
| |
| --show-on-off-events:: |
| Show the --switch-on/off events too. |
| |
| --stitch-lbr:: |
| Show callgraph with stitched LBRs, which may have more complete |
| callgraph. The perf.data file must have been obtained using |
| perf record --call-graph lbr. |
| Disabled by default. In common cases with call stack overflows, |
| it can recreate better call stacks than the default lbr call stack |
| output. But this approach is not foolproof. There can be cases |
| where it creates incorrect call stacks from incorrect matches. |
| The known limitations include exception handing such as |
| setjmp/longjmp will have calls/returns not match. |
| |
| :GMEXAMPLECMD: script |
| :GMEXAMPLESUBCMD: |
| include::guest-files.txt[] |
| |
| SEE ALSO |
| -------- |
| linkperf:perf-record[1], linkperf:perf-script-perl[1], |
| linkperf:perf-script-python[1], linkperf:perf-intel-pt[1], |
| linkperf:perf-dlfilter[1] |