File: libtracecmd-timestamp.txt

package info (click to toggle)
trace-cmd 3.3.1-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 1,992 kB
  • sloc: ansic: 33,557; makefile: 967; python: 604; sh: 400
file content (160 lines) | stat: -rw-r--r-- 4,625 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
libtracecmd(3)
=============

NAME
----
tracecmd_get_first_ts, tracecmd_add_ts_offset, tracecmd_get_tsc2nsec - Handle time stamps from a trace file.

SYNOPSIS
--------
[verse]
--
*#include <trace-cmd.h>*

unsigned long long *tracecmd_get_first_ts*(struct tracecmd_input pass:[*]_handle_);
void *tracecmd_add_ts_offset*(struct tracecmd_input pass:[*]_handle_, long long _offset_);
int *tracecmd_get_tsc2nsec*(struct tracecmd_input pass:[*]_handle_, int pass:[*]_mult_, int pass[*]_shift_, unsigned long long pass:[*]_offset_);
--

DESCRIPTION
-----------
This set of APIs can be used to read tracing data from a trace file opened
with _tracecmd_open()(3)_, _tracecmd_open_fd()(3)_ or _tracecmd_open_head()(3)_.

The *tracecmd_get_first_ts()* function returns the time stamp of the first
record in the _handle_.

The *tracecmd_add_ts_offset()* function adds an offset to each of the records
in the _handle_ that represents a trace file. This is useful for associating two
different tracing files by their offset (for example a trace file from a host
and a trace file from a guest that were not synchronized when created).

The *tracecmd_get_tsc2nsec* returns the calculation values that convert the
raw timestamp into nanoseconds. The parameters are pointers to the storage to save
the values, or NULL to ignore them. The multiplier will be saved in _mult_, the
shift value will be saved in _shift_, and the offset value will be saved in
_offset_, if the corresponding parameters are not NULL.

RETURN VALUE
------------
The *tracecmd_get_first_ts()* function returns the timestamp of the first
record in a trace file for the given _handle_.

The *tracecmd_get_tsc2nsec*() returns 0 if the tracing clock supports the
shift values and -1 otherwise. Note, that if the trace file has the TSC2NSEC
option, the values returned in the parameters may still be valid even if the
function itself returns -1. The return value only notes if the values will
be used in the calculations of the given clock.

EXAMPLE
-------
[source,c]
--
#include <stdlib.h>
#include <trace-cmd.h>

static int print_events(struct tracecmd_input *handle, struct tep_record *record, int cpu, void *data)
{
	static struct trace_seq seq;
	struct tep_handle *tep = tracecmd_get_tep(handle);
	const char *file = tracecmd_get_private(handle);

	if (!seq.buffer)
		trace_seq_init(&seq);

	trace_seq_reset(&seq);
	trace_seq_printf(&seq, "%s: ", file);
	tep_print_event(tep, &seq, record, "%6.1000d [%03d] %s-%d %s: %s\n",
			TEP_PRINT_TIME, TEP_PRINT_CPU, TEP_PRINT_COMM, TEP_PRINT_PID,
			TEP_PRINT_NAME, TEP_PRINT_INFO);
	trace_seq_terminate(&seq);
	trace_seq_do_printf(&seq);
	return 0;
}

int main(int argc, char **argv)
{
	struct tracecmd_input **handles = NULL;
	unsigned long long ts, first_ts = 0;
	unsigned long long offset;
	int multi;
	int shift;
	int nr_handles = 0;
	int ret;
	int i;

	if (argc < 2) {
		printf("usage: %s trace.dat [trace.dat ...]\n", argv[0]);
		exit(-1);
	}

	for (i = 1; i < argc; i++) {
		handles = realloc(handles, sizeof(*handles) * (nr_handles + 1));
		if (!handles)
			exit(-1);
		handles[nr_handles] = tracecmd_open(argv[i], 0);
		if (!handles[nr_handles])
			exit(-1);

		ret = tracecmd_get_tsc2nsec(handles[nr_handles], &multi, &shift, &offset);
		if (!ret)
			printf(" %s has tsc2nsec calculations of mult:%d shift:%d offset:%lld\n",
				argv[i], multi, shift, offset);
		tracecmd_set_private(handles[nr_handles], argv[i]);
		ts = tracecmd_get_first_ts(handles[nr_handles]);
		if (!first_ts || ts < first_ts)
			first_ts = ts;
		nr_handles++;
	}

	/* Set the time stamp to start at the first record found */
	for (i = 0; i < nr_handles; i++)
		tracecmd_add_ts_offset(handles[i], -first_ts);

	tracecmd_iterate_events_multi(handles, nr_handles, print_events, NULL);

	for (i = 0; i < nr_handles; i++)
		tracecmd_close(handles[i]);
	free(handles);
}
--
FILES
-----
[verse]
--
*trace-cmd.h*
	Header file to include in order to have access to the library APIs.
*-ltracecmd*
	Linker switch to add when building a program that uses the library.
--

SEE ALSO
--------
_libtracefs(3)_,
_libtraceevent(3)_,
_trace-cmd(1)_
_trace-cmd.dat(5)_

AUTHOR
------
[verse]
--
*Steven Rostedt* <rostedt@goodmis.org>
*Tzvetomir Stoyanov* <tz.stoyanov@gmail.com>
--
REPORTING BUGS
--------------
Report bugs to  <linux-trace-devel@vger.kernel.org>

LICENSE
-------
libtracecmd is Free Software licensed under the GNU LGPL 2.1

RESOURCES
---------
https://git.kernel.org/pub/scm/utils/trace-cmd/trace-cmd.git/

COPYING
-------
Copyright \(C) 2020 VMware, Inc. Free use of this software is granted under
the terms of the GNU Public License (GPL).