Commit 99417234 authored by Changbin Du's avatar Changbin Du Committed by Namhyung Kim

perf: script: add field 'disasm' to display mnemonic instructions

In addition to the 'insn' field, this adds a new field 'disasm' to
display mnemonic instructions instead of the raw code.

$ sudo perf script -F +disasm
       perf-exec 1443864 [006] 2275506.209848:          psb:  psb offs: 0                                      0 [unknown] ([unknown])
       perf-exec 1443864 [006] 2275506.209848:          cbr:  cbr: 41 freq: 4100 MHz (114%)                    0 [unknown] ([unknown])
              ls 1443864 [006] 2275506.209905:          1  branches:uH:      7f216b426100 _start+0x0 (/usr/lib/x86_64-linux-gnu/ld-2.31.so)	movq %rsp, %rdi
              ls 1443864 [006] 2275506.209908:          1  branches:uH:      7f216b426103 _start+0x3 (/usr/lib/x86_64-linux-gnu/ld-2.31.so)	callq _dl_start+0x0
Signed-off-by: default avatarChangbin Du <changbin.du@huawei.com>
Reviewed-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
Cc: changbin.du@gmail.com
Cc: Thomas Richter <tmricht@linux.ibm.com>
Cc: Andi Kleen <ak@linux.intel.com>
Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
Link: https://lore.kernel.org/r/20240217074046.4100789-4-changbin.du@huawei.com
parent 8f0ec15f
...@@ -132,9 +132,10 @@ OPTIONS ...@@ -132,9 +132,10 @@ OPTIONS
Comma separated list of fields to print. Options are: Comma separated list of fields to print. Options are:
comm, tid, pid, time, cpu, event, trace, ip, sym, dso, dsoff, addr, symoff, comm, tid, pid, time, cpu, event, trace, ip, sym, dso, dsoff, addr, symoff,
srcline, period, iregs, uregs, brstack, brstacksym, flags, bpf-output, srcline, period, iregs, uregs, brstack, brstacksym, flags, bpf-output,
brstackinsn, brstackinsnlen, brstackoff, callindent, insn, insnlen, synth, brstackinsn, brstackinsnlen, brstackoff, callindent, insn, disasm,
phys_addr, metric, misc, srccode, ipc, data_page_size, code_page_size, ins_lat, insnlen, synth, phys_addr, metric, misc, srccode, ipc, data_page_size,
machine_pid, vcpu, cgroup, retire_lat. code_page_size, ins_lat, machine_pid, vcpu, cgroup, retire_lat.
Field list can be prepended with the type, trace, sw or hw, Field list can be prepended with the type, trace, sw or hw,
to indicate to which event type the field list applies. 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 e.g., -F sw:comm,tid,time,ip,sym and -F trace:time,cpu,trace
...@@ -217,9 +218,9 @@ OPTIONS ...@@ -217,9 +218,9 @@ OPTIONS
Instruction Trace decoding. For calls and returns, it will display the Instruction Trace decoding. For calls and returns, it will display the
name of the symbol indented with spaces to reflect the stack depth. name of the symbol indented with spaces to reflect the stack depth.
When doing instruction trace decoding insn and insnlen give the When doing instruction trace decoding, insn, disasm and insnlen give the
instruction bytes and the instruction length of the current instruction bytes, disassembled instructions (requires libcapstone support)
instruction. and the instruction length of the current instruction respectively.
The synth field is used by synthesized events which may be created when The synth field is used by synthesized events which may be created when
Instruction Trace decoding. Instruction Trace decoding.
......
...@@ -135,6 +135,7 @@ enum perf_output_field { ...@@ -135,6 +135,7 @@ enum perf_output_field {
PERF_OUTPUT_CGROUP = 1ULL << 39, PERF_OUTPUT_CGROUP = 1ULL << 39,
PERF_OUTPUT_RETIRE_LAT = 1ULL << 40, PERF_OUTPUT_RETIRE_LAT = 1ULL << 40,
PERF_OUTPUT_DSOFF = 1ULL << 41, PERF_OUTPUT_DSOFF = 1ULL << 41,
PERF_OUTPUT_DISASM = 1ULL << 42,
}; };
struct perf_script { struct perf_script {
...@@ -190,6 +191,7 @@ struct output_option { ...@@ -190,6 +191,7 @@ struct output_option {
{.str = "bpf-output", .field = PERF_OUTPUT_BPF_OUTPUT}, {.str = "bpf-output", .field = PERF_OUTPUT_BPF_OUTPUT},
{.str = "callindent", .field = PERF_OUTPUT_CALLINDENT}, {.str = "callindent", .field = PERF_OUTPUT_CALLINDENT},
{.str = "insn", .field = PERF_OUTPUT_INSN}, {.str = "insn", .field = PERF_OUTPUT_INSN},
{.str = "disasm", .field = PERF_OUTPUT_DISASM},
{.str = "insnlen", .field = PERF_OUTPUT_INSNLEN}, {.str = "insnlen", .field = PERF_OUTPUT_INSNLEN},
{.str = "brstackinsn", .field = PERF_OUTPUT_BRSTACKINSN}, {.str = "brstackinsn", .field = PERF_OUTPUT_BRSTACKINSN},
{.str = "brstackoff", .field = PERF_OUTPUT_BRSTACKOFF}, {.str = "brstackoff", .field = PERF_OUTPUT_BRSTACKOFF},
...@@ -1527,6 +1529,10 @@ static int perf_sample__fprintf_insn(struct perf_sample *sample, ...@@ -1527,6 +1529,10 @@ static int perf_sample__fprintf_insn(struct perf_sample *sample,
printed += fprintf(fp, " insn: "); printed += fprintf(fp, " insn: ");
printed += sample__fprintf_insn_raw(sample, fp); printed += sample__fprintf_insn_raw(sample, fp);
} }
if (PRINT_FIELD(DISASM) && sample->insn_len) {
printed += fprintf(fp, "\t\t");
printed += sample__fprintf_insn_asm(sample, thread, machine, fp);
}
if (PRINT_FIELD(BRSTACKINSN) || PRINT_FIELD(BRSTACKINSNLEN)) if (PRINT_FIELD(BRSTACKINSN) || PRINT_FIELD(BRSTACKINSNLEN))
printed += perf_sample__fprintf_brstackinsn(sample, thread, attr, machine, fp); printed += perf_sample__fprintf_brstackinsn(sample, thread, attr, machine, fp);
...@@ -3118,6 +3124,13 @@ static int parse_output_fields(const struct option *opt __maybe_unused, ...@@ -3118,6 +3124,13 @@ static int parse_output_fields(const struct option *opt __maybe_unused,
rc = -EINVAL; rc = -EINVAL;
goto out; goto out;
} }
#ifndef HAVE_LIBCAPSTONE_SUPPORT
if (change != REMOVE && strcmp(tok, "disasm") == 0) {
fprintf(stderr, "Field \"disasm\" requires perf to be built with libcapstone support.\n");
rc = -EINVAL;
goto out;
}
#endif
if (type == -1) { if (type == -1) {
/* add user option to all events types for /* add user option to all events types for
...@@ -3912,7 +3925,7 @@ int cmd_script(int argc, const char **argv) ...@@ -3912,7 +3925,7 @@ int cmd_script(int argc, const char **argv)
"Fields: comm,tid,pid,time,cpu,event,trace,ip,sym,dso,dsoff," "Fields: comm,tid,pid,time,cpu,event,trace,ip,sym,dso,dsoff,"
"addr,symoff,srcline,period,iregs,uregs,brstack," "addr,symoff,srcline,period,iregs,uregs,brstack,"
"brstacksym,flags,data_src,weight,bpf-output,brstackinsn," "brstacksym,flags,data_src,weight,bpf-output,brstackinsn,"
"brstackinsnlen,brstackoff,callindent,insn,insnlen,synth," "brstackinsnlen,brstackoff,callindent,insn,disasm,insnlen,synth,"
"phys_addr,metric,misc,srccode,ipc,tod,data_page_size," "phys_addr,metric,misc,srccode,ipc,tod,data_page_size,"
"code_page_size,ins_lat,machine_pid,vcpu,cgroup,retire_lat", "code_page_size,ins_lat,machine_pid,vcpu,cgroup,retire_lat",
parse_output_fields), parse_output_fields),
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment