| v1.18: |
| |
| - Use type information to pretty print raw data from stdin, all |
| documented in the man pages, further information in the csets. |
| |
| TLDRish: this almost completely deciphers a perf.data file: |
| |
| $ pahole ~/bin/perf --header=perf_file_header \ |
| -C 'perf_file_attr(range=attrs),perf_event_header(range=data,sizeof,type,type_enum=perf_event_type+perf_user_event_type)' < perf.data |
| |
| What the above command line does: |
| |
| This will state that a 'struct perf_file_header' is available in BTF or DWARF |
| in the ~/bin/perf file and that at the start of stdin it should be used to decode |
| sizeof(struct perf_file_header) bytes, pretty printing it according to its members. |
| |
| Furthermore, that header can be referenced later in the command line, for instance |
| that 'range=data' means that in the header, it expects a 'range' member in |
| 'struct perf_file_header' to be used: |
| |
| $ pahole ~/bin/perf --header=perf_file_header < perf.data |
| { |
| .magic = 3622385352885552464, |
| .size = 104, |
| .attr_size = 136, |
| .attrs = { |
| .offset = 296, |
| .size = 136, |
| }, |
| .data = { |
| .offset = 432, |
| .size = 14688, |
| }, |
| .event_types = { |
| .offset = 0, |
| .size = 0, |
| }, |
| .adds_features = { 376537084, 0, 0, 0 }, |
| }, |
| $ |
| |
| That 'range' field is expected to have 'offset' and 'size' fields, so that |
| it can go on decoding a number of 'struct perf_event_header' entries. |
| |
| That 'sizeof' in turn expects that in 'struct perf_event_header' there is a |
| 'size' field stating how long that particular record is, one can also use |
| 'sizeof=some_other_member_name'. |
| |
| This supports variable sized records and then the 'type' field expects there |
| is a 'struct perf_event_type' member named 'type' (again, type=something_else |
| may be used. Finally, the value in the 'type' field is used to lookup an entry |
| in the set formed by the two enumerations specified in the 'type_enum=' argument. |
| |
| If we look at these enums we'll see that its entries have names that can be, |
| when lowercased, point to structs containing the layout for the variable sized |
| record, which allows it to cast and produce the right pretty printed output. |
| |
| I.e. using the kernel BTF info we get: |
| |
| $ pahole perf_event_type |
| enum perf_event_type { |
| PERF_RECORD_MMAP = 1, |
| PERF_RECORD_LOST = 2, |
| PERF_RECORD_COMM = 3, |
| PERF_RECORD_EXIT = 4, |
| PERF_RECORD_THROTTLE = 5, |
| PERF_RECORD_UNTHROTTLE = 6, |
| PERF_RECORD_FORK = 7, |
| PERF_RECORD_READ = 8, |
| PERF_RECORD_SAMPLE = 9, |
| PERF_RECORD_MMAP2 = 10, |
| PERF_RECORD_AUX = 11, |
| PERF_RECORD_ITRACE_START = 12, |
| PERF_RECORD_LOST_SAMPLES = 13, |
| PERF_RECORD_SWITCH = 14, |
| PERF_RECORD_SWITCH_CPU_WIDE = 15, |
| PERF_RECORD_NAMESPACES = 16, |
| PERF_RECORD_KSYMBOL = 17, |
| PERF_RECORD_BPF_EVENT = 18, |
| PERF_RECORD_CGROUP = 19, |
| PERF_RECORD_TEXT_POKE = 20, |
| PERF_RECORD_MAX = 21, |
| }; |
| $ |
| |
| That is the same as in ~/bin/perf, and, if we get one of these and ask for |
| that struct: |
| |
| $ pahole -C perf_record_mmap ~/bin/perf |
| struct perf_record_mmap { |
| struct perf_event_header header; /* 0 8 */ |
| __u32 pid; /* 8 4 */ |
| __u32 tid; /* 12 4 */ |
| __u64 start; /* 16 8 */ |
| __u64 len; /* 24 8 */ |
| __u64 pgoff; /* 32 8 */ |
| char filename[4096]; /* 40 4096 */ |
| |
| /* size: 4136, cachelines: 65, members: 7 */ |
| /* last cacheline: 40 bytes */ |
| }; |
| $ |
| |
| Many other options were introduced to work with this, including --count, |
| --skip, etc, look at the man page for details. |
| |
| - Store percpu variables in vmlinux BTF. This can be disabled when debugging |
| kernel features being developed to use it. |
| |
| - pahole now should be segfault free when handling gdb test suit DWARF |
| files, including ADA, FORTRAN, rust and dwp compressed files, the |
| later being just flatly refused, that got left for v1.19. |
| |
| - Bail out on partial units for now, avoiding segfaults and providing warning |
| to user, hopefully will be addressed in v1.19. |
| |
| Signed-off-by: Arnaldo Carvalho de Melo <[email protected]> |