| #include <stdlib.h> |
| #include <ctype.h> |
| #include <tracefs.h> |
| |
| static void read_subbuf(struct tep_handle *tep, struct kbuffer *kbuf) |
| { |
| static struct trace_seq seq; |
| struct tep_record record; |
| int missed_events; |
| |
| if (seq.buffer) |
| trace_seq_reset(&seq); |
| else |
| trace_seq_init(&seq); |
| |
| while ((record.data = kbuffer_read_event(kbuf, &record.ts))) { |
| record.size = kbuffer_event_size(kbuf); |
| missed_events = kbuffer_missed_events(kbuf); |
| if (missed_events) { |
| printf("[MISSED EVENTS"); |
| if (missed_events > 0) |
| printf(": %d]\n", missed_events); |
| else |
| printf("]\n"); |
| } |
| kbuffer_next_event(kbuf, NULL); |
| tep_print_event(tep, &seq, &record, |
| "%s-%d %6.1000d\t%s: %s\n", |
| TEP_PRINT_COMM, |
| TEP_PRINT_PID, |
| TEP_PRINT_TIME, |
| TEP_PRINT_NAME, |
| TEP_PRINT_INFO); |
| trace_seq_do_printf(&seq); |
| trace_seq_reset(&seq); |
| } |
| } |
| |
| int main (int argc, char **argv) |
| { |
| struct tracefs_cpu *tcpu; |
| struct tep_handle *tep; |
| struct kbuffer *kbuf; |
| bool mapped; |
| int cpu; |
| |
| if (argc < 2 || !isdigit(argv[1][0])) { |
| printf("usage: %s cpu\n\n", argv[0]); |
| exit(-1); |
| } |
| |
| cpu = atoi(argv[1]); |
| |
| tep = tracefs_local_events(NULL); |
| if (!tep) { |
| perror("Reading trace event formats"); |
| exit(-1); |
| } |
| |
| tcpu = tracefs_cpu_open_mapped(NULL, cpu, 0); |
| if (!tcpu) { |
| perror("Open CPU 0 file"); |
| exit(-1); |
| } |
| |
| /* |
| * If this kernel supports mapping, use normal read, |
| * otherwise use the piped buffer read, although if |
| * the mapping succeeded, tracefs_cpu_buffered_read_buf() |
| * acts the same as tracefs_cpu_read_buf(). But this is just |
| * an example on how to use tracefs_cpu_is_mapped(). |
| */ |
| mapped = tracefs_cpu_is_mapped(tcpu); |
| if (!mapped) |
| printf("Was not able to map, falling back to buffered read\n"); |
| while ((kbuf = mapped ? tracefs_cpu_read_buf(tcpu, true) : |
| tracefs_cpu_buffered_read_buf(tcpu, true))) { |
| read_subbuf(tep, kbuf); |
| } |
| |
| kbuf = tracefs_cpu_flush_buf(tcpu); |
| if (kbuf) |
| read_subbuf(tep, kbuf); |
| |
| tracefs_cpu_close(tcpu); |
| tep_free(tep); |
| |
| return 0; |
| } |
| |