209 lines
5.1 KiB
Plaintext
209 lines
5.1 KiB
Plaintext
libtraceevent(3)
|
|
================
|
|
|
|
NAME
|
|
----
|
|
kbuffer_timestamp, kbuffer_subbuf_timestamp -
|
|
Functions that read various data of a kbuffer descriptor
|
|
|
|
SYNOPSIS
|
|
--------
|
|
[verse]
|
|
--
|
|
*#include <kbuffer.h>*
|
|
|
|
unsigned long long *kbuffer_timestamp*(struct kbuffer pass:[*]_kbuf_);
|
|
unsigned long long *kbuffer_subbuf_timestamp*(struct kbuffer pass:[*]_kbuf_, void pass:[*]_subbuf_);
|
|
--
|
|
|
|
DESCRIPTION
|
|
-----------
|
|
The function *kbuffer_timestamp()* returns the timestamp of the current event of _kbuf_.
|
|
|
|
The function *kbuffer_subbuf_timestamp()* returns the timestamp for the sub-buffer
|
|
that was loaded in _kbuf_. This usually is (but not guaranteed to be) the timestamp
|
|
of the first event on the sub-buffer.
|
|
|
|
The function *kbuffer_start_of_data()* returns the offset of where the delta
|
|
|
|
RETURN VALUE
|
|
------------
|
|
*kbuffer_read_event()* returns the event that the _kbuf_ descriptor is currently at,
|
|
or NULL if the last event was passed (by *kbuffer_next_event()*).
|
|
|
|
*kbuffer_next_event()* returns the next event after the current event or NULL if there
|
|
are no more events.
|
|
|
|
*kbuffer_read_at_offset()* returns the event at a given _offset_ from the start of
|
|
the sub-buffer stored in _kbuf_, or NULL if there exists no event. Note, _offset_
|
|
only needs to be an offset that lands on the record, or is at the start of it. It does
|
|
not need to be exactly at the beginning of the record.
|
|
|
|
*kbuffer_missed_events()* returns 0 if there were no missed events before loaded sub-buffer.
|
|
Returns -1 if there were an unknown number of missed events, or if the number of missed events
|
|
is known, that number will be returned.
|
|
|
|
*kbuffer_event_size()* returns the size of the data payload of the current event of _kbuf_.
|
|
|
|
*kbuffer_curr_size()* returns the size of the entire record of the current event of _kbuf_.
|
|
This includes the size of the meta data for that record.
|
|
|
|
*kbuf_curr_offset()* returns the offset of the current record from the beginning of the _kbuf_
|
|
sub-buffer.
|
|
|
|
*kbuf_curr_index()* returns the index of the current record from the beginning of the _kbuf_
|
|
data section.
|
|
|
|
EXAMPLE
|
|
-------
|
|
[source,c]
|
|
--
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <fcntl.h>
|
|
#include <unistd.h>
|
|
#include <sys/stat.h>
|
|
|
|
#include <kbuffer.h>
|
|
|
|
int main (int argc, char **argv)
|
|
{
|
|
unsigned long long ts;
|
|
struct kbuffer *kbuf;
|
|
struct stat st;
|
|
char *buf;
|
|
void *event;
|
|
int save_offset = -1;
|
|
int record_size;
|
|
int offset;
|
|
int index;
|
|
int size;
|
|
int ret;
|
|
int fd;
|
|
int i = 0;
|
|
|
|
if (argc < 2) {
|
|
printf("usage: %s raw-subbuffer-page\n", argv[0]);
|
|
printf(" Try: dd count=1 bs=4096 if=/sys/kernel/tracing/per_cpu/cpu0/trace_pipe_raw of=/tmp/file\n");
|
|
exit(0);
|
|
}
|
|
|
|
if (stat(argv[1], &st) < 0) {
|
|
perror("stat");
|
|
exit(-1);
|
|
}
|
|
|
|
buf = malloc(st.st_size);
|
|
if (!buf) {
|
|
perror("Allocating buffer");
|
|
exit(-1);
|
|
}
|
|
|
|
fd = open(argv[1], O_RDONLY);
|
|
if (fd < 0) {
|
|
perror(argv[1]);
|
|
exit(-1);
|
|
}
|
|
|
|
ret = read(fd, buf, st.st_size);
|
|
if (ret < 0) {
|
|
perror("Reading buffer");
|
|
exit(-1);
|
|
}
|
|
close(fd);
|
|
|
|
kbuf = kbuffer_alloc(KBUFFER_ENDIAN_SAME_AS_HOST,
|
|
KBUFFER_LSIZE_SAME_AS_HOST);
|
|
if (!kbuf) {
|
|
perror("Creating kbuffer");
|
|
exit(-1);
|
|
}
|
|
ret = kbuffer_load_subbuffer(kbuf, buf);
|
|
if (ret < 0) {
|
|
perror("Loading sub bufer");
|
|
exit(-1);
|
|
}
|
|
|
|
if (kbuffer_subbuffer_size(kbuf) > st.st_size) {
|
|
fprintf(stderr, "kbuffer is bigger than raw size %d > %ld\n",
|
|
kbuffer_subbuffer_size(kbuf), st.st_size);
|
|
exit(-1);
|
|
}
|
|
|
|
ret = kbuffer_missed_events(kbuf);
|
|
if (ret) {
|
|
if (ret > 0)
|
|
printf("Missed %d events before this buffer\n", ret);
|
|
else
|
|
printf("Missed unknown number of events before this buffer\n");
|
|
}
|
|
do {
|
|
event = kbuffer_read_event(kbuf, &ts);
|
|
if (event) {
|
|
record_size = kbuffer_curr_size(kbuf);
|
|
offset = kbuffer_curr_offset(kbuf);
|
|
index = kbuffer_curr_index(kbuf);
|
|
size = kbuffer_event_size(kbuf);
|
|
|
|
if (i == 20)
|
|
save_offset = offset;
|
|
printf(" event %3d ts:%lld\trecord_size:%d size:%d\tindex:%d offset:%d\n",
|
|
i++, ts, record_size, size, index, offset);
|
|
event = kbuffer_next_event(kbuf, NULL);
|
|
}
|
|
} while (event);
|
|
|
|
if (!event)
|
|
printf("Finished sub buffer\n");
|
|
|
|
if (save_offset > 0) {
|
|
event = kbuffer_read_at_offset(kbuf, save_offset, &ts);
|
|
if (!event) {
|
|
fprintf(stderr, "Funny, can't find event 20 at offset %d\n", save_offset);
|
|
exit(-1);
|
|
}
|
|
record_size = kbuffer_curr_size(kbuf);
|
|
offset = kbuffer_curr_offset(kbuf);
|
|
index = kbuffer_curr_index(kbuf);
|
|
size = kbuffer_event_size(kbuf);
|
|
|
|
printf("\n saved event 20 ts:%lld\trecord_size:%d size:%d\tindex:%d offset:%d\n\n",
|
|
ts, record_size, size, index, offset);
|
|
}
|
|
kbuffer_free(kbuf);
|
|
|
|
return 0;
|
|
}
|
|
--
|
|
FILES
|
|
-----
|
|
[verse]
|
|
--
|
|
*event-parse.h*
|
|
Header file to include in order to have access to the library APIs.
|
|
*-ltraceevent*
|
|
Linker switch to add when building a program that uses the library.
|
|
--
|
|
|
|
SEE ALSO
|
|
--------
|
|
*libtraceevent*(3), *trace-cmd*(1)
|
|
|
|
AUTHOR
|
|
------
|
|
[verse]
|
|
--
|
|
*Steven Rostedt* <rostedt@goodmis.org>, author of *libtraceevent*.
|
|
--
|
|
REPORTING BUGS
|
|
--------------
|
|
Report bugs to <linux-trace-devel@vger.kernel.org>
|
|
|
|
LICENSE
|
|
-------
|
|
libtraceevent is Free Software licensed under the GNU LGPL 2.1
|
|
|
|
RESOURCES
|
|
---------
|
|
https://git.kernel.org/pub/scm/libs/libtrace/libtraceevent.git/
|