1*436bf2bcSAndroid Build Coastguard Workerlibtraceevent(3) 2*436bf2bcSAndroid Build Coastguard Worker================ 3*436bf2bcSAndroid Build Coastguard Worker 4*436bf2bcSAndroid Build Coastguard WorkerNAME 5*436bf2bcSAndroid Build Coastguard Worker---- 6*436bf2bcSAndroid Build Coastguard Workerkbuffer_timestamp, kbuffer_subbuf_timestamp - 7*436bf2bcSAndroid Build Coastguard WorkerFunctions that read various data of a kbuffer descriptor 8*436bf2bcSAndroid Build Coastguard Worker 9*436bf2bcSAndroid Build Coastguard WorkerSYNOPSIS 10*436bf2bcSAndroid Build Coastguard Worker-------- 11*436bf2bcSAndroid Build Coastguard Worker[verse] 12*436bf2bcSAndroid Build Coastguard Worker-- 13*436bf2bcSAndroid Build Coastguard Worker*#include <kbuffer.h>* 14*436bf2bcSAndroid Build Coastguard Worker 15*436bf2bcSAndroid Build Coastguard Workerunsigned long long *kbuffer_timestamp*(struct kbuffer pass:[*]_kbuf_); 16*436bf2bcSAndroid Build Coastguard Workerunsigned long long *kbuffer_subbuf_timestamp*(struct kbuffer pass:[*]_kbuf_, void pass:[*]_subbuf_); 17*436bf2bcSAndroid Build Coastguard Worker-- 18*436bf2bcSAndroid Build Coastguard Worker 19*436bf2bcSAndroid Build Coastguard WorkerDESCRIPTION 20*436bf2bcSAndroid Build Coastguard Worker----------- 21*436bf2bcSAndroid Build Coastguard WorkerThe function *kbuffer_timestamp()* returns the timestamp of the current event of _kbuf_. 22*436bf2bcSAndroid Build Coastguard Worker 23*436bf2bcSAndroid Build Coastguard WorkerThe function *kbuffer_subbuf_timestamp()* returns the timestamp for the sub-buffer 24*436bf2bcSAndroid Build Coastguard Workerthat was loaded in _kbuf_. This usually is (but not guaranteed to be) the timestamp 25*436bf2bcSAndroid Build Coastguard Workerof the first event on the sub-buffer. 26*436bf2bcSAndroid Build Coastguard Worker 27*436bf2bcSAndroid Build Coastguard WorkerThe function *kbuffer_start_of_data()* returns the offset of where the delta 28*436bf2bcSAndroid Build Coastguard Worker 29*436bf2bcSAndroid Build Coastguard WorkerRETURN VALUE 30*436bf2bcSAndroid Build Coastguard Worker------------ 31*436bf2bcSAndroid Build Coastguard Worker*kbuffer_read_event()* returns the event that the _kbuf_ descriptor is currently at, 32*436bf2bcSAndroid Build Coastguard Workeror NULL if the last event was passed (by *kbuffer_next_event()*). 33*436bf2bcSAndroid Build Coastguard Worker 34*436bf2bcSAndroid Build Coastguard Worker*kbuffer_next_event()* returns the next event after the current event or NULL if there 35*436bf2bcSAndroid Build Coastguard Workerare no more events. 36*436bf2bcSAndroid Build Coastguard Worker 37*436bf2bcSAndroid Build Coastguard Worker*kbuffer_read_at_offset()* returns the event at a given _offset_ from the start of 38*436bf2bcSAndroid Build Coastguard Workerthe sub-buffer stored in _kbuf_, or NULL if there exists no event. Note, _offset_ 39*436bf2bcSAndroid Build Coastguard Workeronly needs to be an offset that lands on the record, or is at the start of it. It does 40*436bf2bcSAndroid Build Coastguard Workernot need to be exactly at the beginning of the record. 41*436bf2bcSAndroid Build Coastguard Worker 42*436bf2bcSAndroid Build Coastguard Worker*kbuffer_missed_events()* returns 0 if there were no missed events before loaded sub-buffer. 43*436bf2bcSAndroid Build Coastguard WorkerReturns -1 if there were an unknown number of missed events, or if the number of missed events 44*436bf2bcSAndroid Build Coastguard Workeris known, that number will be returned. 45*436bf2bcSAndroid Build Coastguard Worker 46*436bf2bcSAndroid Build Coastguard Worker*kbuffer_event_size()* returns the size of the data payload of the current event of _kbuf_. 47*436bf2bcSAndroid Build Coastguard Worker 48*436bf2bcSAndroid Build Coastguard Worker*kbuffer_curr_size()* returns the size of the entire record of the current event of _kbuf_. 49*436bf2bcSAndroid Build Coastguard WorkerThis includes the size of the meta data for that record. 50*436bf2bcSAndroid Build Coastguard Worker 51*436bf2bcSAndroid Build Coastguard Worker*kbuf_curr_offset()* returns the offset of the current record from the beginning of the _kbuf_ 52*436bf2bcSAndroid Build Coastguard Workersub-buffer. 53*436bf2bcSAndroid Build Coastguard Worker 54*436bf2bcSAndroid Build Coastguard Worker*kbuf_curr_index()* returns the index of the current record from the beginning of the _kbuf_ 55*436bf2bcSAndroid Build Coastguard Workerdata section. 56*436bf2bcSAndroid Build Coastguard Worker 57*436bf2bcSAndroid Build Coastguard WorkerEXAMPLE 58*436bf2bcSAndroid Build Coastguard Worker------- 59*436bf2bcSAndroid Build Coastguard Worker[source,c] 60*436bf2bcSAndroid Build Coastguard Worker-- 61*436bf2bcSAndroid Build Coastguard Worker#include <stdio.h> 62*436bf2bcSAndroid Build Coastguard Worker#include <stdlib.h> 63*436bf2bcSAndroid Build Coastguard Worker#include <fcntl.h> 64*436bf2bcSAndroid Build Coastguard Worker#include <unistd.h> 65*436bf2bcSAndroid Build Coastguard Worker#include <sys/stat.h> 66*436bf2bcSAndroid Build Coastguard Worker 67*436bf2bcSAndroid Build Coastguard Worker#include <kbuffer.h> 68*436bf2bcSAndroid Build Coastguard Worker 69*436bf2bcSAndroid Build Coastguard Workerint main (int argc, char **argv) 70*436bf2bcSAndroid Build Coastguard Worker{ 71*436bf2bcSAndroid Build Coastguard Worker unsigned long long ts; 72*436bf2bcSAndroid Build Coastguard Worker struct kbuffer *kbuf; 73*436bf2bcSAndroid Build Coastguard Worker struct stat st; 74*436bf2bcSAndroid Build Coastguard Worker char *buf; 75*436bf2bcSAndroid Build Coastguard Worker void *event; 76*436bf2bcSAndroid Build Coastguard Worker int save_offset = -1; 77*436bf2bcSAndroid Build Coastguard Worker int record_size; 78*436bf2bcSAndroid Build Coastguard Worker int offset; 79*436bf2bcSAndroid Build Coastguard Worker int index; 80*436bf2bcSAndroid Build Coastguard Worker int size; 81*436bf2bcSAndroid Build Coastguard Worker int ret; 82*436bf2bcSAndroid Build Coastguard Worker int fd; 83*436bf2bcSAndroid Build Coastguard Worker int i = 0; 84*436bf2bcSAndroid Build Coastguard Worker 85*436bf2bcSAndroid Build Coastguard Worker if (argc < 2) { 86*436bf2bcSAndroid Build Coastguard Worker printf("usage: %s raw-subbuffer-page\n", argv[0]); 87*436bf2bcSAndroid Build Coastguard Worker printf(" Try: dd count=1 bs=4096 if=/sys/kernel/tracing/per_cpu/cpu0/trace_pipe_raw of=/tmp/file\n"); 88*436bf2bcSAndroid Build Coastguard Worker exit(0); 89*436bf2bcSAndroid Build Coastguard Worker } 90*436bf2bcSAndroid Build Coastguard Worker 91*436bf2bcSAndroid Build Coastguard Worker if (stat(argv[1], &st) < 0) { 92*436bf2bcSAndroid Build Coastguard Worker perror("stat"); 93*436bf2bcSAndroid Build Coastguard Worker exit(-1); 94*436bf2bcSAndroid Build Coastguard Worker } 95*436bf2bcSAndroid Build Coastguard Worker 96*436bf2bcSAndroid Build Coastguard Worker buf = malloc(st.st_size); 97*436bf2bcSAndroid Build Coastguard Worker if (!buf) { 98*436bf2bcSAndroid Build Coastguard Worker perror("Allocating buffer"); 99*436bf2bcSAndroid Build Coastguard Worker exit(-1); 100*436bf2bcSAndroid Build Coastguard Worker } 101*436bf2bcSAndroid Build Coastguard Worker 102*436bf2bcSAndroid Build Coastguard Worker fd = open(argv[1], O_RDONLY); 103*436bf2bcSAndroid Build Coastguard Worker if (fd < 0) { 104*436bf2bcSAndroid Build Coastguard Worker perror(argv[1]); 105*436bf2bcSAndroid Build Coastguard Worker exit(-1); 106*436bf2bcSAndroid Build Coastguard Worker } 107*436bf2bcSAndroid Build Coastguard Worker 108*436bf2bcSAndroid Build Coastguard Worker ret = read(fd, buf, st.st_size); 109*436bf2bcSAndroid Build Coastguard Worker if (ret < 0) { 110*436bf2bcSAndroid Build Coastguard Worker perror("Reading buffer"); 111*436bf2bcSAndroid Build Coastguard Worker exit(-1); 112*436bf2bcSAndroid Build Coastguard Worker } 113*436bf2bcSAndroid Build Coastguard Worker close(fd); 114*436bf2bcSAndroid Build Coastguard Worker 115*436bf2bcSAndroid Build Coastguard Worker kbuf = kbuffer_alloc(KBUFFER_ENDIAN_SAME_AS_HOST, 116*436bf2bcSAndroid Build Coastguard Worker KBUFFER_LSIZE_SAME_AS_HOST); 117*436bf2bcSAndroid Build Coastguard Worker if (!kbuf) { 118*436bf2bcSAndroid Build Coastguard Worker perror("Creating kbuffer"); 119*436bf2bcSAndroid Build Coastguard Worker exit(-1); 120*436bf2bcSAndroid Build Coastguard Worker } 121*436bf2bcSAndroid Build Coastguard Worker ret = kbuffer_load_subbuffer(kbuf, buf); 122*436bf2bcSAndroid Build Coastguard Worker if (ret < 0) { 123*436bf2bcSAndroid Build Coastguard Worker perror("Loading sub bufer"); 124*436bf2bcSAndroid Build Coastguard Worker exit(-1); 125*436bf2bcSAndroid Build Coastguard Worker } 126*436bf2bcSAndroid Build Coastguard Worker 127*436bf2bcSAndroid Build Coastguard Worker if (kbuffer_subbuffer_size(kbuf) > st.st_size) { 128*436bf2bcSAndroid Build Coastguard Worker fprintf(stderr, "kbuffer is bigger than raw size %d > %ld\n", 129*436bf2bcSAndroid Build Coastguard Worker kbuffer_subbuffer_size(kbuf), st.st_size); 130*436bf2bcSAndroid Build Coastguard Worker exit(-1); 131*436bf2bcSAndroid Build Coastguard Worker } 132*436bf2bcSAndroid Build Coastguard Worker 133*436bf2bcSAndroid Build Coastguard Worker ret = kbuffer_missed_events(kbuf); 134*436bf2bcSAndroid Build Coastguard Worker if (ret) { 135*436bf2bcSAndroid Build Coastguard Worker if (ret > 0) 136*436bf2bcSAndroid Build Coastguard Worker printf("Missed %d events before this buffer\n", ret); 137*436bf2bcSAndroid Build Coastguard Worker else 138*436bf2bcSAndroid Build Coastguard Worker printf("Missed unknown number of events before this buffer\n"); 139*436bf2bcSAndroid Build Coastguard Worker } 140*436bf2bcSAndroid Build Coastguard Worker do { 141*436bf2bcSAndroid Build Coastguard Worker event = kbuffer_read_event(kbuf, &ts); 142*436bf2bcSAndroid Build Coastguard Worker if (event) { 143*436bf2bcSAndroid Build Coastguard Worker record_size = kbuffer_curr_size(kbuf); 144*436bf2bcSAndroid Build Coastguard Worker offset = kbuffer_curr_offset(kbuf); 145*436bf2bcSAndroid Build Coastguard Worker index = kbuffer_curr_index(kbuf); 146*436bf2bcSAndroid Build Coastguard Worker size = kbuffer_event_size(kbuf); 147*436bf2bcSAndroid Build Coastguard Worker 148*436bf2bcSAndroid Build Coastguard Worker if (i == 20) 149*436bf2bcSAndroid Build Coastguard Worker save_offset = offset; 150*436bf2bcSAndroid Build Coastguard Worker printf(" event %3d ts:%lld\trecord_size:%d size:%d\tindex:%d offset:%d\n", 151*436bf2bcSAndroid Build Coastguard Worker i++, ts, record_size, size, index, offset); 152*436bf2bcSAndroid Build Coastguard Worker event = kbuffer_next_event(kbuf, NULL); 153*436bf2bcSAndroid Build Coastguard Worker } 154*436bf2bcSAndroid Build Coastguard Worker } while (event); 155*436bf2bcSAndroid Build Coastguard Worker 156*436bf2bcSAndroid Build Coastguard Worker if (!event) 157*436bf2bcSAndroid Build Coastguard Worker printf("Finished sub buffer\n"); 158*436bf2bcSAndroid Build Coastguard Worker 159*436bf2bcSAndroid Build Coastguard Worker if (save_offset > 0) { 160*436bf2bcSAndroid Build Coastguard Worker event = kbuffer_read_at_offset(kbuf, save_offset, &ts); 161*436bf2bcSAndroid Build Coastguard Worker if (!event) { 162*436bf2bcSAndroid Build Coastguard Worker fprintf(stderr, "Funny, can't find event 20 at offset %d\n", save_offset); 163*436bf2bcSAndroid Build Coastguard Worker exit(-1); 164*436bf2bcSAndroid Build Coastguard Worker } 165*436bf2bcSAndroid Build Coastguard Worker record_size = kbuffer_curr_size(kbuf); 166*436bf2bcSAndroid Build Coastguard Worker offset = kbuffer_curr_offset(kbuf); 167*436bf2bcSAndroid Build Coastguard Worker index = kbuffer_curr_index(kbuf); 168*436bf2bcSAndroid Build Coastguard Worker size = kbuffer_event_size(kbuf); 169*436bf2bcSAndroid Build Coastguard Worker 170*436bf2bcSAndroid Build Coastguard Worker printf("\n saved event 20 ts:%lld\trecord_size:%d size:%d\tindex:%d offset:%d\n\n", 171*436bf2bcSAndroid Build Coastguard Worker ts, record_size, size, index, offset); 172*436bf2bcSAndroid Build Coastguard Worker } 173*436bf2bcSAndroid Build Coastguard Worker kbuffer_free(kbuf); 174*436bf2bcSAndroid Build Coastguard Worker 175*436bf2bcSAndroid Build Coastguard Worker return 0; 176*436bf2bcSAndroid Build Coastguard Worker} 177*436bf2bcSAndroid Build Coastguard Worker-- 178*436bf2bcSAndroid Build Coastguard WorkerFILES 179*436bf2bcSAndroid Build Coastguard Worker----- 180*436bf2bcSAndroid Build Coastguard Worker[verse] 181*436bf2bcSAndroid Build Coastguard Worker-- 182*436bf2bcSAndroid Build Coastguard Worker*event-parse.h* 183*436bf2bcSAndroid Build Coastguard Worker Header file to include in order to have access to the library APIs. 184*436bf2bcSAndroid Build Coastguard Worker*-ltraceevent* 185*436bf2bcSAndroid Build Coastguard Worker Linker switch to add when building a program that uses the library. 186*436bf2bcSAndroid Build Coastguard Worker-- 187*436bf2bcSAndroid Build Coastguard Worker 188*436bf2bcSAndroid Build Coastguard WorkerSEE ALSO 189*436bf2bcSAndroid Build Coastguard Worker-------- 190*436bf2bcSAndroid Build Coastguard Worker*libtraceevent*(3), *trace-cmd*(1) 191*436bf2bcSAndroid Build Coastguard Worker 192*436bf2bcSAndroid Build Coastguard WorkerAUTHOR 193*436bf2bcSAndroid Build Coastguard Worker------ 194*436bf2bcSAndroid Build Coastguard Worker[verse] 195*436bf2bcSAndroid Build Coastguard Worker-- 196*436bf2bcSAndroid Build Coastguard Worker*Steven Rostedt* <[email protected]>, author of *libtraceevent*. 197*436bf2bcSAndroid Build Coastguard Worker-- 198*436bf2bcSAndroid Build Coastguard WorkerREPORTING BUGS 199*436bf2bcSAndroid Build Coastguard Worker-------------- 200*436bf2bcSAndroid Build Coastguard WorkerReport bugs to <[email protected]> 201*436bf2bcSAndroid Build Coastguard Worker 202*436bf2bcSAndroid Build Coastguard WorkerLICENSE 203*436bf2bcSAndroid Build Coastguard Worker------- 204*436bf2bcSAndroid Build Coastguard Workerlibtraceevent is Free Software licensed under the GNU LGPL 2.1 205*436bf2bcSAndroid Build Coastguard Worker 206*436bf2bcSAndroid Build Coastguard WorkerRESOURCES 207*436bf2bcSAndroid Build Coastguard Worker--------- 208*436bf2bcSAndroid Build Coastguard Workerhttps://git.kernel.org/pub/scm/libs/libtrace/libtraceevent.git/ 209