mirror of
https://github.com/armbian/linux-cix.git
synced 2026-01-06 12:30:45 -08:00
tools lib traceevent: Remove libtraceevent
libtraceevent is now out-of-date and it is better to depend on the system version. Remove this code that is no longer depended upon by any builds. Committer notes: Removed the removed tools/lib/traceevent/ from tools/perf/MANIFEST, so that 'make perf-tar-src-pkg' works. Signed-off-by: Ian Rogers <irogers@google.com> Acked-by: Steven Rostedt (VMware) <rostedt@goodmis.org> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Kan Liang <kan.liang@linux.intel.com> Cc: Leo Yan <leo.yan@linaro.org> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Masami Hiramatsu <mhiramat@kernel.org> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Link: http://lore.kernel.org/lkml/20221130062935.2219247-5-irogers@google.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
committed by
Arnaldo Carvalho de Melo
parent
378ef0f5d9
commit
4171925aa9
4
tools/lib/traceevent/.gitignore
vendored
4
tools/lib/traceevent/.gitignore
vendored
@@ -1,4 +0,0 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
TRACEEVENT-CFLAGS
|
||||
libtraceevent-dynamic-list
|
||||
libtraceevent.so.*
|
||||
@@ -1,8 +0,0 @@
|
||||
libtraceevent-y += event-parse.o
|
||||
libtraceevent-y += event-plugin.o
|
||||
libtraceevent-y += trace-seq.o
|
||||
libtraceevent-y += parse-filter.o
|
||||
libtraceevent-y += parse-utils.o
|
||||
libtraceevent-y += kbuffer-parse.o
|
||||
libtraceevent-y += tep_strerror.o
|
||||
libtraceevent-y += event-parse-api.o
|
||||
@@ -1,207 +0,0 @@
|
||||
include ../../../scripts/Makefile.include
|
||||
include ../../../scripts/utilities.mak
|
||||
|
||||
# This Makefile and manpage XSL files were taken from tools/perf/Documentation
|
||||
# and modified for libtraceevent.
|
||||
|
||||
MAN3_TXT= \
|
||||
$(wildcard libtraceevent-*.txt) \
|
||||
libtraceevent.txt
|
||||
|
||||
MAN_TXT = $(MAN3_TXT)
|
||||
_MAN_XML=$(patsubst %.txt,%.xml,$(MAN_TXT))
|
||||
_MAN_HTML=$(patsubst %.txt,%.html,$(MAN_TXT))
|
||||
_DOC_MAN3=$(patsubst %.txt,%.3,$(MAN3_TXT))
|
||||
|
||||
MAN_XML=$(addprefix $(OUTPUT),$(_MAN_XML))
|
||||
MAN_HTML=$(addprefix $(OUTPUT),$(_MAN_HTML))
|
||||
DOC_MAN3=$(addprefix $(OUTPUT),$(_DOC_MAN3))
|
||||
|
||||
# Make the path relative to DESTDIR, not prefix
|
||||
ifndef DESTDIR
|
||||
prefix?=$(HOME)
|
||||
endif
|
||||
bindir?=$(prefix)/bin
|
||||
htmldir?=$(prefix)/share/doc/libtraceevent-doc
|
||||
pdfdir?=$(prefix)/share/doc/libtraceevent-doc
|
||||
mandir?=$(prefix)/share/man
|
||||
man3dir=$(mandir)/man3
|
||||
|
||||
ASCIIDOC=asciidoc
|
||||
ASCIIDOC_EXTRA = --unsafe -f asciidoc.conf
|
||||
ASCIIDOC_HTML = xhtml11
|
||||
MANPAGE_XSL = manpage-normal.xsl
|
||||
XMLTO_EXTRA =
|
||||
INSTALL?=install
|
||||
RM ?= rm -f
|
||||
|
||||
ifdef USE_ASCIIDOCTOR
|
||||
ASCIIDOC = asciidoctor
|
||||
ASCIIDOC_EXTRA = -a compat-mode
|
||||
ASCIIDOC_EXTRA += -I. -rasciidoctor-extensions
|
||||
ASCIIDOC_EXTRA += -a mansource="libtraceevent" -a manmanual="libtraceevent Manual"
|
||||
ASCIIDOC_HTML = xhtml5
|
||||
endif
|
||||
|
||||
XMLTO=xmlto
|
||||
|
||||
_tmp_tool_path := $(call get-executable,$(ASCIIDOC))
|
||||
ifeq ($(_tmp_tool_path),)
|
||||
missing_tools = $(ASCIIDOC)
|
||||
endif
|
||||
|
||||
ifndef USE_ASCIIDOCTOR
|
||||
_tmp_tool_path := $(call get-executable,$(XMLTO))
|
||||
ifeq ($(_tmp_tool_path),)
|
||||
missing_tools += $(XMLTO)
|
||||
endif
|
||||
endif
|
||||
|
||||
#
|
||||
# For asciidoc ...
|
||||
# -7.1.2, no extra settings are needed.
|
||||
# 8.0-, set ASCIIDOC8.
|
||||
#
|
||||
|
||||
#
|
||||
# For docbook-xsl ...
|
||||
# -1.68.1, set ASCIIDOC_NO_ROFF? (based on changelog from 1.73.0)
|
||||
# 1.69.0, no extra settings are needed?
|
||||
# 1.69.1-1.71.0, set DOCBOOK_SUPPRESS_SP?
|
||||
# 1.71.1, no extra settings are needed?
|
||||
# 1.72.0, set DOCBOOK_XSL_172.
|
||||
# 1.73.0-, set ASCIIDOC_NO_ROFF
|
||||
#
|
||||
|
||||
#
|
||||
# If you had been using DOCBOOK_XSL_172 in an attempt to get rid
|
||||
# of 'the ".ft C" problem' in your generated manpages, and you
|
||||
# instead ended up with weird characters around callouts, try
|
||||
# using ASCIIDOC_NO_ROFF instead (it works fine with ASCIIDOC8).
|
||||
#
|
||||
|
||||
ifdef ASCIIDOC8
|
||||
ASCIIDOC_EXTRA += -a asciidoc7compatible
|
||||
endif
|
||||
ifdef DOCBOOK_XSL_172
|
||||
ASCIIDOC_EXTRA += -a libtraceevent-asciidoc-no-roff
|
||||
MANPAGE_XSL = manpage-1.72.xsl
|
||||
else
|
||||
ifdef ASCIIDOC_NO_ROFF
|
||||
# docbook-xsl after 1.72 needs the regular XSL, but will not
|
||||
# pass-thru raw roff codes from asciidoc.conf, so turn them off.
|
||||
ASCIIDOC_EXTRA += -a libtraceevent-asciidoc-no-roff
|
||||
endif
|
||||
endif
|
||||
ifdef MAN_BOLD_LITERAL
|
||||
XMLTO_EXTRA += -m manpage-bold-literal.xsl
|
||||
endif
|
||||
ifdef DOCBOOK_SUPPRESS_SP
|
||||
XMLTO_EXTRA += -m manpage-suppress-sp.xsl
|
||||
endif
|
||||
|
||||
SHELL_PATH ?= $(SHELL)
|
||||
# Shell quote;
|
||||
SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
|
||||
|
||||
DESTDIR ?=
|
||||
DESTDIR_SQ = '$(subst ','\'',$(DESTDIR))'
|
||||
|
||||
export DESTDIR DESTDIR_SQ
|
||||
|
||||
#
|
||||
# Please note that there is a minor bug in asciidoc.
|
||||
# The version after 6.0.3 _will_ include the patch found here:
|
||||
# http://marc.theaimsgroup.com/?l=libtraceevent&m=111558757202243&w=2
|
||||
#
|
||||
# Until that version is released you may have to apply the patch
|
||||
# yourself - yes, all 6 characters of it!
|
||||
#
|
||||
QUIET_SUBDIR0 = +$(MAKE) -C # space to separate -C and subdir
|
||||
QUIET_SUBDIR1 =
|
||||
|
||||
ifneq ($(findstring $(MAKEFLAGS),w),w)
|
||||
PRINT_DIR = --no-print-directory
|
||||
else # "make -w"
|
||||
NO_SUBDIR = :
|
||||
endif
|
||||
|
||||
ifneq ($(findstring $(MAKEFLAGS),s),s)
|
||||
ifneq ($(V),1)
|
||||
QUIET_ASCIIDOC = @echo ' ASCIIDOC '$@;
|
||||
QUIET_XMLTO = @echo ' XMLTO '$@;
|
||||
QUIET_SUBDIR0 = +@subdir=
|
||||
QUIET_SUBDIR1 = ;$(NO_SUBDIR) \
|
||||
echo ' SUBDIR ' $$subdir; \
|
||||
$(MAKE) $(PRINT_DIR) -C $$subdir
|
||||
export V
|
||||
endif
|
||||
endif
|
||||
|
||||
all: html man
|
||||
|
||||
man: man3
|
||||
man3: $(DOC_MAN3)
|
||||
|
||||
html: $(MAN_HTML)
|
||||
|
||||
$(MAN_HTML) $(DOC_MAN3): asciidoc.conf
|
||||
|
||||
install: install-man
|
||||
|
||||
check-man-tools:
|
||||
ifdef missing_tools
|
||||
$(error "You need to install $(missing_tools) for man pages")
|
||||
endif
|
||||
|
||||
do-install-man: man
|
||||
$(call QUIET_INSTALL, Documentation-man) \
|
||||
$(INSTALL) -d -m 755 $(DESTDIR)$(man3dir); \
|
||||
$(INSTALL) -m 644 $(DOC_MAN3) $(DESTDIR)$(man3dir);
|
||||
|
||||
install-man: check-man-tools man do-install-man
|
||||
|
||||
uninstall: uninstall-man
|
||||
|
||||
uninstall-man:
|
||||
$(call QUIET_UNINST, Documentation-man) \
|
||||
$(Q)$(RM) $(addprefix $(DESTDIR)$(man3dir)/,$(DOC_MAN3))
|
||||
|
||||
|
||||
ifdef missing_tools
|
||||
DO_INSTALL_MAN = $(warning Please install $(missing_tools) to have the man pages installed)
|
||||
else
|
||||
DO_INSTALL_MAN = do-install-man
|
||||
endif
|
||||
|
||||
CLEAN_FILES = \
|
||||
$(MAN_XML) $(addsuffix +,$(MAN_XML)) \
|
||||
$(MAN_HTML) $(addsuffix +,$(MAN_HTML)) \
|
||||
$(DOC_MAN3) *.3
|
||||
|
||||
clean:
|
||||
$(call QUIET_CLEAN, Documentation) $(RM) $(CLEAN_FILES)
|
||||
|
||||
ifdef USE_ASCIIDOCTOR
|
||||
$(OUTPUT)%.3 : $(OUTPUT)%.txt
|
||||
$(QUIET_ASCIIDOC)$(RM) $@+ $@ && \
|
||||
$(ASCIIDOC) -b manpage -d manpage \
|
||||
$(ASCIIDOC_EXTRA) -alibtraceevent_version=$(EVENT_PARSE_VERSION) -o $@+ $< && \
|
||||
mv $@+ $@
|
||||
endif
|
||||
|
||||
$(OUTPUT)%.3 : $(OUTPUT)%.xml
|
||||
$(QUIET_XMLTO)$(RM) $@ && \
|
||||
$(XMLTO) -o $(OUTPUT). -m $(MANPAGE_XSL) $(XMLTO_EXTRA) man $<
|
||||
|
||||
$(OUTPUT)%.xml : %.txt
|
||||
$(QUIET_ASCIIDOC)$(RM) $@+ $@ && \
|
||||
$(ASCIIDOC) -b docbook -d manpage \
|
||||
$(ASCIIDOC_EXTRA) -alibtraceevent_version=$(EVENT_PARSE_VERSION) -o $@+ $< && \
|
||||
mv $@+ $@
|
||||
|
||||
$(MAN_HTML): $(OUTPUT)%.html : %.txt
|
||||
$(QUIET_ASCIIDOC)$(RM) $@+ $@ && \
|
||||
$(ASCIIDOC) -b $(ASCIIDOC_HTML) -d manpage \
|
||||
$(ASCIIDOC_EXTRA) -aperf_version=$(EVENT_PARSE_VERSION) -o $@+ $< && \
|
||||
mv $@+ $@
|
||||
@@ -1,120 +0,0 @@
|
||||
## linktep: macro
|
||||
#
|
||||
# Usage: linktep:command[manpage-section]
|
||||
#
|
||||
# Note, {0} is the manpage section, while {target} is the command.
|
||||
#
|
||||
# Show TEP link as: <command>(<section>); if section is defined, else just show
|
||||
# the command.
|
||||
|
||||
[macros]
|
||||
(?su)[\\]?(?P<name>linktep):(?P<target>\S*?)\[(?P<attrlist>.*?)\]=
|
||||
|
||||
[attributes]
|
||||
asterisk=*
|
||||
plus=+
|
||||
caret=^
|
||||
startsb=[
|
||||
endsb=]
|
||||
tilde=~
|
||||
|
||||
ifdef::backend-docbook[]
|
||||
[linktep-inlinemacro]
|
||||
{0%{target}}
|
||||
{0#<citerefentry>}
|
||||
{0#<refentrytitle>{target}</refentrytitle><manvolnum>{0}</manvolnum>}
|
||||
{0#</citerefentry>}
|
||||
endif::backend-docbook[]
|
||||
|
||||
ifdef::backend-docbook[]
|
||||
ifndef::tep-asciidoc-no-roff[]
|
||||
# "unbreak" docbook-xsl v1.68 for manpages. v1.69 works with or without this.
|
||||
# v1.72 breaks with this because it replaces dots not in roff requests.
|
||||
[listingblock]
|
||||
<example><title>{title}</title>
|
||||
<literallayout>
|
||||
ifdef::doctype-manpage[]
|
||||
.ft C
|
||||
endif::doctype-manpage[]
|
||||
|
|
||||
ifdef::doctype-manpage[]
|
||||
.ft
|
||||
endif::doctype-manpage[]
|
||||
</literallayout>
|
||||
{title#}</example>
|
||||
endif::tep-asciidoc-no-roff[]
|
||||
|
||||
ifdef::tep-asciidoc-no-roff[]
|
||||
ifdef::doctype-manpage[]
|
||||
# The following two small workarounds insert a simple paragraph after screen
|
||||
[listingblock]
|
||||
<example><title>{title}</title>
|
||||
<literallayout>
|
||||
|
|
||||
</literallayout><simpara></simpara>
|
||||
{title#}</example>
|
||||
|
||||
[verseblock]
|
||||
<formalpara{id? id="{id}"}><title>{title}</title><para>
|
||||
{title%}<literallayout{id? id="{id}"}>
|
||||
{title#}<literallayout>
|
||||
|
|
||||
</literallayout>
|
||||
{title#}</para></formalpara>
|
||||
{title%}<simpara></simpara>
|
||||
endif::doctype-manpage[]
|
||||
endif::tep-asciidoc-no-roff[]
|
||||
endif::backend-docbook[]
|
||||
|
||||
ifdef::doctype-manpage[]
|
||||
ifdef::backend-docbook[]
|
||||
[header]
|
||||
template::[header-declarations]
|
||||
<refentry>
|
||||
<refmeta>
|
||||
<refentrytitle>{mantitle}</refentrytitle>
|
||||
<manvolnum>{manvolnum}</manvolnum>
|
||||
<refmiscinfo class="source">libtraceevent</refmiscinfo>
|
||||
<refmiscinfo class="version">{libtraceevent_version}</refmiscinfo>
|
||||
<refmiscinfo class="manual">libtraceevent Manual</refmiscinfo>
|
||||
</refmeta>
|
||||
<refnamediv>
|
||||
<refname>{manname1}</refname>
|
||||
<refname>{manname2}</refname>
|
||||
<refname>{manname3}</refname>
|
||||
<refname>{manname4}</refname>
|
||||
<refname>{manname5}</refname>
|
||||
<refname>{manname6}</refname>
|
||||
<refname>{manname7}</refname>
|
||||
<refname>{manname8}</refname>
|
||||
<refname>{manname9}</refname>
|
||||
<refname>{manname10}</refname>
|
||||
<refname>{manname11}</refname>
|
||||
<refname>{manname12}</refname>
|
||||
<refname>{manname13}</refname>
|
||||
<refname>{manname14}</refname>
|
||||
<refname>{manname15}</refname>
|
||||
<refname>{manname16}</refname>
|
||||
<refname>{manname17}</refname>
|
||||
<refname>{manname18}</refname>
|
||||
<refname>{manname19}</refname>
|
||||
<refname>{manname20}</refname>
|
||||
<refname>{manname21}</refname>
|
||||
<refname>{manname22}</refname>
|
||||
<refname>{manname23}</refname>
|
||||
<refname>{manname24}</refname>
|
||||
<refname>{manname25}</refname>
|
||||
<refname>{manname26}</refname>
|
||||
<refname>{manname27}</refname>
|
||||
<refname>{manname28}</refname>
|
||||
<refname>{manname29}</refname>
|
||||
<refname>{manname30}</refname>
|
||||
<refpurpose>{manpurpose}</refpurpose>
|
||||
</refnamediv>
|
||||
endif::backend-docbook[]
|
||||
endif::doctype-manpage[]
|
||||
|
||||
ifdef::backend-xhtml11[]
|
||||
[linktep-inlinemacro]
|
||||
<a href="{target}.html">{target}{0?({0})}</a>
|
||||
endif::backend-xhtml11[]
|
||||
@@ -1,153 +0,0 @@
|
||||
libtraceevent(3)
|
||||
================
|
||||
|
||||
NAME
|
||||
----
|
||||
tep_register_comm, tep_override_comm, tep_pid_is_registered,
|
||||
tep_data_comm_from_pid, tep_data_pid_from_comm, tep_cmdline_pid -
|
||||
Manage pid to process name mappings.
|
||||
|
||||
SYNOPSIS
|
||||
--------
|
||||
[verse]
|
||||
--
|
||||
*#include <event-parse.h>*
|
||||
|
||||
int *tep_register_comm*(struct tep_handle pass:[*]_tep_, const char pass:[*]_comm_, int _pid_);
|
||||
int *tep_override_comm*(struct tep_handle pass:[*]_tep_, const char pass:[*]_comm_, int _pid_);
|
||||
bool *tep_is_pid_registered*(struct tep_handle pass:[*]_tep_, int _pid_);
|
||||
const char pass:[*]*tep_data_comm_from_pid*(struct tep_handle pass:[*]_pevent_, int _pid_);
|
||||
struct cmdline pass:[*]*tep_data_pid_from_comm*(struct tep_handle pass:[*]_pevent_, const char pass:[*]_comm_, struct cmdline pass:[*]_next_);
|
||||
int *tep_cmdline_pid*(struct tep_handle pass:[*]_pevent_, struct cmdline pass:[*]_cmdline_);
|
||||
--
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
These functions can be used to handle the mapping between pid and process name.
|
||||
The library builds a cache of these mappings, which is used to display the name
|
||||
of the process, instead of its pid. This information can be retrieved from
|
||||
tracefs/saved_cmdlines file.
|
||||
|
||||
The _tep_register_comm()_ function registers a _pid_ / process name mapping.
|
||||
If a command with the same _pid_ is already registered, an error is returned.
|
||||
The _pid_ argument is the process ID, the _comm_ argument is the process name,
|
||||
_tep_ is the event context. The _comm_ is duplicated internally.
|
||||
|
||||
The _tep_override_comm()_ function registers a _pid_ / process name mapping.
|
||||
If a process with the same pid is already registered, the process name string is
|
||||
udapted with the new one. The _pid_ argument is the process ID, the _comm_
|
||||
argument is the process name, _tep_ is the event context. The _comm_ is
|
||||
duplicated internally.
|
||||
|
||||
The _tep_is_pid_registered()_ function checks if a pid has a process name
|
||||
mapping registered. The _pid_ argument is the process ID, _tep_ is the event
|
||||
context.
|
||||
|
||||
The _tep_data_comm_from_pid()_ function returns the process name for a given
|
||||
pid. The _pid_ argument is the process ID, _tep_ is the event context.
|
||||
The returned string should not be freed, but will be freed when the _tep_
|
||||
handler is closed.
|
||||
|
||||
The _tep_data_pid_from_comm()_ function returns a pid for a given process name.
|
||||
The _comm_ argument is the process name, _tep_ is the event context.
|
||||
The argument _next_ is the cmdline structure to search for the next pid.
|
||||
As there may be more than one pid for a given process, the result of this call
|
||||
can be passed back into a recurring call in the _next_ parameter, to search for
|
||||
the next pid. If _next_ is NULL, it will return the first pid associated with
|
||||
the _comm_. The function performs a linear search, so it may be slow.
|
||||
|
||||
The _tep_cmdline_pid()_ function returns the pid associated with a given
|
||||
_cmdline_. The _tep_ argument is the event context.
|
||||
|
||||
RETURN VALUE
|
||||
------------
|
||||
_tep_register_comm()_ function returns 0 on success. In case of an error -1 is
|
||||
returned and errno is set to indicate the cause of the problem: ENOMEM, if there
|
||||
is not enough memory to duplicate the _comm_ or EEXIST if a mapping for this
|
||||
_pid_ is already registered.
|
||||
|
||||
_tep_override_comm()_ function returns 0 on success. In case of an error -1 is
|
||||
returned and errno is set to indicate the cause of the problem: ENOMEM, if there
|
||||
is not enough memory to duplicate the _comm_.
|
||||
|
||||
_tep_is_pid_registered()_ function returns true if the _pid_ has a process name
|
||||
mapped to it, false otherwise.
|
||||
|
||||
_tep_data_comm_from_pid()_ function returns the process name as string, or the
|
||||
string "<...>" if there is no mapping for the given pid.
|
||||
|
||||
_tep_data_pid_from_comm()_ function returns a pointer to a struct cmdline, that
|
||||
holds a pid for a given process, or NULL if none is found. This result can be
|
||||
passed back into a recurring call as the _next_ parameter of the function.
|
||||
|
||||
_tep_cmdline_pid()_ functions returns the pid for the give cmdline. If _cmdline_
|
||||
is NULL, then -1 is returned.
|
||||
|
||||
EXAMPLE
|
||||
-------
|
||||
The following example registers pid for command "ls", in context of event _tep_
|
||||
and performs various searches for pid / process name mappings:
|
||||
[source,c]
|
||||
--
|
||||
#include <event-parse.h>
|
||||
...
|
||||
int ret;
|
||||
int ls_pid = 1021;
|
||||
struct tep_handle *tep = tep_alloc();
|
||||
...
|
||||
ret = tep_register_comm(tep, "ls", ls_pid);
|
||||
if (ret != 0 && errno == EEXIST)
|
||||
ret = tep_override_comm(tep, "ls", ls_pid);
|
||||
if (ret != 0) {
|
||||
/* Failed to register pid / command mapping */
|
||||
}
|
||||
...
|
||||
if (tep_is_pid_registered(tep, ls_pid) == 0) {
|
||||
/* Command mapping for ls_pid is not registered */
|
||||
}
|
||||
...
|
||||
const char *comm = tep_data_comm_from_pid(tep, ls_pid);
|
||||
if (comm) {
|
||||
/* Found process name for ls_pid */
|
||||
}
|
||||
...
|
||||
int pid;
|
||||
struct cmdline *cmd = tep_data_pid_from_comm(tep, "ls", NULL);
|
||||
while (cmd) {
|
||||
pid = tep_cmdline_pid(tep, cmd);
|
||||
/* Found pid for process "ls" */
|
||||
cmd = tep_data_pid_from_comm(tep, "ls", cmd);
|
||||
}
|
||||
--
|
||||
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*.
|
||||
*Tzvetomir Stoyanov* <tz.stoyanov@gmail.com>, author of this man page.
|
||||
--
|
||||
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/linux/kernel/git/torvalds/linux.git
|
||||
@@ -1,77 +0,0 @@
|
||||
libtraceevent(3)
|
||||
================
|
||||
|
||||
NAME
|
||||
----
|
||||
tep_get_cpus, tep_set_cpus - Get / set the number of CPUs, which have a tracing
|
||||
buffer representing it. Note, the buffer may be empty.
|
||||
|
||||
SYNOPSIS
|
||||
--------
|
||||
[verse]
|
||||
--
|
||||
*#include <event-parse.h>*
|
||||
|
||||
int *tep_get_cpus*(struct tep_handle pass:[*]_tep_);
|
||||
void *tep_set_cpus*(struct tep_handle pass:[*]_tep_, int _cpus_);
|
||||
--
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
The _tep_get_cpus()_ function gets the number of CPUs, which have a tracing
|
||||
buffer representing it. The _tep_ argument is trace event parser context.
|
||||
|
||||
The _tep_set_cpus()_ function sets the number of CPUs, which have a tracing
|
||||
buffer representing it. The _tep_ argument is trace event parser context.
|
||||
The _cpu_ argument is the number of CPUs with tracing data.
|
||||
|
||||
RETURN VALUE
|
||||
------------
|
||||
The _tep_get_cpus()_ functions returns the number of CPUs, which have tracing
|
||||
data recorded.
|
||||
|
||||
EXAMPLE
|
||||
-------
|
||||
[source,c]
|
||||
--
|
||||
#include <event-parse.h>
|
||||
...
|
||||
struct tep_handle *tep = tep_alloc();
|
||||
...
|
||||
tep_set_cpus(tep, 5);
|
||||
...
|
||||
printf("We have tracing data for %d CPUs", tep_get_cpus(tep));
|
||||
--
|
||||
|
||||
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*.
|
||||
*Tzvetomir Stoyanov* <tz.stoyanov@gmail.com>, author of this man page.
|
||||
--
|
||||
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/linux/kernel/git/torvalds/linux.git
|
||||
@@ -1,78 +0,0 @@
|
||||
libtraceevent(3)
|
||||
================
|
||||
|
||||
NAME
|
||||
----
|
||||
tep_read_number - Reads a number from raw data.
|
||||
|
||||
SYNOPSIS
|
||||
--------
|
||||
[verse]
|
||||
--
|
||||
*#include <event-parse.h>*
|
||||
|
||||
unsigned long long *tep_read_number*(struct tep_handle pass:[*]_tep_, const void pass:[*]_ptr_, int _size_);
|
||||
--
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
The _tep_read_number()_ function reads an integer from raw data, taking into
|
||||
account the endianness of the raw data and the current host. The _tep_ argument
|
||||
is the trace event parser context. The _ptr_ is a pointer to the raw data, where
|
||||
the integer is, and the _size_ is the size of the integer.
|
||||
|
||||
RETURN VALUE
|
||||
------------
|
||||
The _tep_read_number()_ function returns the integer in the byte order of
|
||||
the current host. In case of an error, 0 is returned.
|
||||
|
||||
EXAMPLE
|
||||
-------
|
||||
[source,c]
|
||||
--
|
||||
#include <event-parse.h>
|
||||
...
|
||||
struct tep_handle *tep = tep_alloc();
|
||||
...
|
||||
void process_record(struct tep_record *record)
|
||||
{
|
||||
int offset = 24;
|
||||
int data = tep_read_number(tep, record->data + offset, 4);
|
||||
|
||||
/* Read the 4 bytes at the offset 24 of data as an integer */
|
||||
}
|
||||
...
|
||||
--
|
||||
|
||||
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*.
|
||||
*Tzvetomir Stoyanov* <tz.stoyanov@gmail.com>, author of this man page.
|
||||
--
|
||||
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/linux/kernel/git/torvalds/linux.git
|
||||
@@ -1,103 +0,0 @@
|
||||
libtraceevent(3)
|
||||
================
|
||||
|
||||
NAME
|
||||
----
|
||||
tep_find_event,tep_find_event_by_name,tep_find_event_by_record -
|
||||
Find events by given key.
|
||||
|
||||
SYNOPSIS
|
||||
--------
|
||||
[verse]
|
||||
--
|
||||
*#include <event-parse.h>*
|
||||
|
||||
struct tep_event pass:[*]*tep_find_event*(struct tep_handle pass:[*]_tep_, int _id_);
|
||||
struct tep_event pass:[*]*tep_find_event_by_name*(struct tep_handle pass:[*]_tep_, const char pass:[*]_sys_, const char pass:[*]_name_);
|
||||
struct tep_event pass:[*]*tep_find_event_by_record*(struct tep_handle pass:[*]_tep_, struct tep_record pass:[*]_record_);
|
||||
--
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
This set of functions can be used to search for an event, based on a given
|
||||
criteria. All functions require a pointer to a _tep_, trace event parser
|
||||
context.
|
||||
|
||||
The _tep_find_event()_ function searches for an event by given event _id_. The
|
||||
event ID is assigned dynamically and can be viewed in event's format file,
|
||||
"ID" field.
|
||||
|
||||
The tep_find_event_by_name()_ function searches for an event by given
|
||||
event _name_, under the system _sys_. If the _sys_ is NULL (not specified),
|
||||
the first event with _name_ is returned.
|
||||
|
||||
The tep_find_event_by_record()_ function searches for an event from a given
|
||||
_record_.
|
||||
|
||||
RETURN VALUE
|
||||
------------
|
||||
All these functions return a pointer to the found event, or NULL if there is no
|
||||
such event.
|
||||
|
||||
EXAMPLE
|
||||
-------
|
||||
[source,c]
|
||||
--
|
||||
#include <event-parse.h>
|
||||
...
|
||||
struct tep_handle *tep = tep_alloc();
|
||||
...
|
||||
struct tep_event *event;
|
||||
|
||||
event = tep_find_event(tep, 1857);
|
||||
if (event == NULL) {
|
||||
/* There is no event with ID 1857 */
|
||||
}
|
||||
|
||||
event = tep_find_event_by_name(tep, "kvm", "kvm_exit");
|
||||
if (event == NULL) {
|
||||
/* There is no kvm_exit event, from kvm system */
|
||||
}
|
||||
|
||||
void event_from_record(struct tep_record *record)
|
||||
{
|
||||
struct tep_event *event = tep_find_event_by_record(tep, record);
|
||||
if (event == NULL) {
|
||||
/* There is no event from given record */
|
||||
}
|
||||
}
|
||||
...
|
||||
--
|
||||
|
||||
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*.
|
||||
*Tzvetomir Stoyanov* <tz.stoyanov@gmail.com>, author of this man page.
|
||||
--
|
||||
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/linux/kernel/git/torvalds/linux.git
|
||||
@@ -1,99 +0,0 @@
|
||||
libtraceevent(3)
|
||||
================
|
||||
|
||||
NAME
|
||||
----
|
||||
tep_get_event, tep_get_first_event, tep_get_events_count - Access events.
|
||||
|
||||
SYNOPSIS
|
||||
--------
|
||||
[verse]
|
||||
--
|
||||
*#include <event-parse.h>*
|
||||
|
||||
struct tep_event pass:[*]*tep_get_event*(struct tep_handle pass:[*]_tep_, int _index_);
|
||||
struct tep_event pass:[*]*tep_get_first_event*(struct tep_handle pass:[*]_tep_);
|
||||
int *tep_get_events_count*(struct tep_handle pass:[*]_tep_);
|
||||
--
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
The _tep_get_event()_ function returns a pointer to event at the given _index_.
|
||||
The _tep_ argument is trace event parser context, the _index_ is the index of
|
||||
the requested event.
|
||||
|
||||
The _tep_get_first_event()_ function returns a pointer to the first event.
|
||||
As events are stored in an array, this function returns the pointer to the
|
||||
beginning of the array. The _tep_ argument is trace event parser context.
|
||||
|
||||
The _tep_get_events_count()_ function returns the number of the events
|
||||
in the array. The _tep_ argument is trace event parser context.
|
||||
|
||||
RETURN VALUE
|
||||
------------
|
||||
The _tep_get_event()_ returns a pointer to the event located at _index_.
|
||||
NULL is returned in case of error, in case there are no events or _index_ is
|
||||
out of range.
|
||||
|
||||
The _tep_get_first_event()_ returns a pointer to the first event. NULL is
|
||||
returned in case of error, or in case there are no events.
|
||||
|
||||
The _tep_get_events_count()_ returns the number of the events. 0 is
|
||||
returned in case of error, or in case there are no events.
|
||||
|
||||
EXAMPLE
|
||||
-------
|
||||
[source,c]
|
||||
--
|
||||
#include <event-parse.h>
|
||||
...
|
||||
struct tep_handle *tep = tep_alloc();
|
||||
...
|
||||
int i,count = tep_get_events_count(tep);
|
||||
struct tep_event *event, *events = tep_get_first_event(tep);
|
||||
|
||||
if (events == NULL) {
|
||||
/* There are no events */
|
||||
} else {
|
||||
for (i = 0; i < count; i++) {
|
||||
event = (events+i);
|
||||
/* process events[i] */
|
||||
}
|
||||
|
||||
/* Get the last event */
|
||||
event = tep_get_event(tep, count-1);
|
||||
}
|
||||
--
|
||||
|
||||
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*.
|
||||
*Tzvetomir Stoyanov* <tz.stoyanov@gmail.com>, author of this man page.
|
||||
--
|
||||
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/linux/kernel/git/torvalds/linux.git
|
||||
@@ -1,122 +0,0 @@
|
||||
libtraceevent(3)
|
||||
================
|
||||
|
||||
NAME
|
||||
----
|
||||
tep_list_events, tep_list_events_copy -
|
||||
Get list of events, sorted by given criteria.
|
||||
|
||||
SYNOPSIS
|
||||
--------
|
||||
[verse]
|
||||
--
|
||||
*#include <event-parse.h>*
|
||||
|
||||
enum *tep_event_sort_type* {
|
||||
_TEP_EVENT_SORT_ID_,
|
||||
_TEP_EVENT_SORT_NAME_,
|
||||
_TEP_EVENT_SORT_SYSTEM_,
|
||||
};
|
||||
|
||||
struct tep_event pass:[*]pass:[*]*tep_list_events*(struct tep_handle pass:[*]_tep_, enum tep_event_sort_type _sort_type_);
|
||||
struct tep_event pass:[*]pass:[*]*tep_list_events_copy*(struct tep_handle pass:[*]_tep_, enum tep_event_sort_type _sort_type_);
|
||||
--
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
The _tep_list_events()_ function returns an array of pointers to the events,
|
||||
sorted by the _sort_type_ criteria. The last element of the array is NULL.
|
||||
The returned memory must not be freed, it is managed by the library.
|
||||
The function is not thread safe. The _tep_ argument is trace event parser
|
||||
context. The _sort_type_ argument is the required sort criteria:
|
||||
[verse]
|
||||
--
|
||||
_TEP_EVENT_SORT_ID_ - sort by the event ID.
|
||||
_TEP_EVENT_SORT_NAME_ - sort by the event (name, system, id) triplet.
|
||||
_TEP_EVENT_SORT_SYSTEM_ - sort by the event (system, name, id) triplet.
|
||||
--
|
||||
|
||||
The _tep_list_events_copy()_ is a thread safe version of _tep_list_events()_.
|
||||
It has the same behavior, but the returned array is allocated internally and
|
||||
must be freed by the caller. Note that the content of the array must not be
|
||||
freed (see the EXAMPLE below).
|
||||
|
||||
RETURN VALUE
|
||||
------------
|
||||
The _tep_list_events()_ function returns an array of pointers to events.
|
||||
In case of an error, NULL is returned. The returned array must not be freed,
|
||||
it is managed by the library.
|
||||
|
||||
The _tep_list_events_copy()_ function returns an array of pointers to events.
|
||||
In case of an error, NULL is returned. The returned array must be freed by
|
||||
the caller.
|
||||
|
||||
EXAMPLE
|
||||
-------
|
||||
[source,c]
|
||||
--
|
||||
#include <event-parse.h>
|
||||
...
|
||||
struct tep_handle *tep = tep_alloc();
|
||||
...
|
||||
int i;
|
||||
struct tep_event_format **events;
|
||||
|
||||
i=0;
|
||||
events = tep_list_events(tep, TEP_EVENT_SORT_ID);
|
||||
if (events == NULL) {
|
||||
/* Failed to get the events, sorted by ID */
|
||||
} else {
|
||||
while(events[i]) {
|
||||
/* walk through the list of the events, sorted by ID */
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
i=0;
|
||||
events = tep_list_events_copy(tep, TEP_EVENT_SORT_NAME);
|
||||
if (events == NULL) {
|
||||
/* Failed to get the events, sorted by name */
|
||||
} else {
|
||||
while(events[i]) {
|
||||
/* walk through the list of the events, sorted by name */
|
||||
i++;
|
||||
}
|
||||
free(events);
|
||||
}
|
||||
|
||||
...
|
||||
--
|
||||
|
||||
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*.
|
||||
*Tzvetomir Stoyanov* <tz.stoyanov@gmail.com>, author of this man page.
|
||||
--
|
||||
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/linux/kernel/git/torvalds/linux.git
|
||||
@@ -1,130 +0,0 @@
|
||||
libtraceevent(3)
|
||||
================
|
||||
|
||||
NAME
|
||||
----
|
||||
tep_print_event - Writes event information into a trace sequence.
|
||||
|
||||
SYNOPSIS
|
||||
--------
|
||||
[verse]
|
||||
--
|
||||
*#include <event-parse.h>*
|
||||
*#include <trace-seq.h>*
|
||||
|
||||
void *tep_print_event*(struct tep_handle pass:[*]_tep_, struct trace_seqpass:[*]_s_, struct tep_record pass:[*]_record_, const char pass:[*]_fmt_, _..._)
|
||||
--
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
|
||||
The _tep_print_event()_ function parses the event information of the given
|
||||
_record_ and writes it into the trace sequence _s_, according to the format
|
||||
string _fmt_. The desired information is specified after the format string.
|
||||
The _fmt_ is printf-like format string, following arguments are supported:
|
||||
[verse]
|
||||
--
|
||||
TEP_PRINT_PID, "%d" - PID of the event.
|
||||
TEP_PRINT_CPU, "%d" - Event CPU.
|
||||
TEP_PRINT_COMM, "%s" - Event command string.
|
||||
TEP_PRINT_NAME, "%s" - Event name.
|
||||
TEP_PRINT_LATENCY, "%s" - Latency of the event. It prints 4 or more
|
||||
fields - interrupt state, scheduling state,
|
||||
current context, and preemption count.
|
||||
Field 1 is the interrupt enabled state:
|
||||
d : Interrupts are disabled
|
||||
. : Interrupts are enabled
|
||||
X : The architecture does not support this
|
||||
information
|
||||
Field 2 is the "need resched" state.
|
||||
N : The task is set to call the scheduler when
|
||||
possible, as another higher priority task
|
||||
may need to be scheduled in.
|
||||
. : The task is not set to call the scheduler.
|
||||
Field 3 is the context state.
|
||||
. : Normal context
|
||||
s : Soft interrupt context
|
||||
h : Hard interrupt context
|
||||
H : Hard interrupt context which triggered
|
||||
during soft interrupt context.
|
||||
z : NMI context
|
||||
Z : NMI context which triggered during hard
|
||||
interrupt context
|
||||
Field 4 is the preemption count.
|
||||
. : The preempt count is zero.
|
||||
On preemptible kernels (where the task can be scheduled
|
||||
out in arbitrary locations while in kernel context), the
|
||||
preempt count, when non zero, will prevent the kernel
|
||||
from scheduling out the current task. The preempt count
|
||||
number is displayed when it is not zero.
|
||||
Depending on the kernel, it may show other fields
|
||||
(lock depth, or migration disabled, which are unique to
|
||||
specialized kernels).
|
||||
TEP_PRINT_TIME, %d - event time stamp. A divisor and precision can be
|
||||
specified as part of this format string:
|
||||
"%precision.divisord". Example:
|
||||
"%3.1000d" - divide the time by 1000 and print the first
|
||||
3 digits before the dot. Thus, the time stamp
|
||||
"123456000" will be printed as "123.456"
|
||||
TEP_PRINT_INFO, "%s" - event information.
|
||||
TEP_PRINT_INFO_RAW, "%s" - event information, in raw format.
|
||||
|
||||
--
|
||||
EXAMPLE
|
||||
-------
|
||||
[source,c]
|
||||
--
|
||||
#include <event-parse.h>
|
||||
#include <trace-seq.h>
|
||||
...
|
||||
struct trace_seq seq;
|
||||
trace_seq_init(&seq);
|
||||
struct tep_handle *tep = tep_alloc();
|
||||
...
|
||||
void print_my_event(struct tep_record *record)
|
||||
{
|
||||
trace_seq_reset(&seq);
|
||||
tep_print_event(tep, s, record, "%16s-%-5d [%03d] %s %6.1000d %s %s",
|
||||
TEP_PRINT_COMM, TEP_PRINT_PID, TEP_PRINT_CPU,
|
||||
TEP_PRINT_LATENCY, TEP_PRINT_TIME, TEP_PRINT_NAME,
|
||||
TEP_PRINT_INFO);
|
||||
}
|
||||
...
|
||||
--
|
||||
|
||||
FILES
|
||||
-----
|
||||
[verse]
|
||||
--
|
||||
*event-parse.h*
|
||||
Header file to include in order to have access to the library APIs.
|
||||
*trace-seq.h*
|
||||
Header file to include in order to have access to trace sequences related APIs.
|
||||
Trace sequences are used to allow a function to call several other functions
|
||||
to create a string of data to use.
|
||||
*-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*.
|
||||
*Tzvetomir Stoyanov* <tz.stoyanov@gmail.com>, author of this man page.
|
||||
--
|
||||
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/linux/kernel/git/torvalds/linux.git
|
||||
@@ -1,118 +0,0 @@
|
||||
libtraceevent(3)
|
||||
================
|
||||
|
||||
NAME
|
||||
----
|
||||
tep_find_common_field, tep_find_field, tep_find_any_field -
|
||||
Search for a field in an event.
|
||||
|
||||
SYNOPSIS
|
||||
--------
|
||||
[verse]
|
||||
--
|
||||
*#include <event-parse.h>*
|
||||
|
||||
struct tep_format_field pass:[*]*tep_find_common_field*(struct tep_event pass:[*]_event_, const char pass:[*]_name_);
|
||||
struct tep_format_field pass:[*]*tep_find_field*(struct tep_event_ormat pass:[*]_event_, const char pass:[*]_name_);
|
||||
struct tep_format_field pass:[*]*tep_find_any_field*(struct tep_event pass:[*]_event_, const char pass:[*]_name_);
|
||||
--
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
These functions search for a field with given name in an event. The field
|
||||
returned can be used to find the field content from within a data record.
|
||||
|
||||
The _tep_find_common_field()_ function searches for a common field with _name_
|
||||
in the _event_.
|
||||
|
||||
The _tep_find_field()_ function searches for an event specific field with
|
||||
_name_ in the _event_.
|
||||
|
||||
The _tep_find_any_field()_ function searches for any field with _name_ in the
|
||||
_event_.
|
||||
|
||||
RETURN VALUE
|
||||
------------
|
||||
The _tep_find_common_field(), _tep_find_field()_ and _tep_find_any_field()_
|
||||
functions return a pointer to the found field, or NULL in case there is no field
|
||||
with the requested name.
|
||||
|
||||
EXAMPLE
|
||||
-------
|
||||
[source,c]
|
||||
--
|
||||
#include <event-parse.h>
|
||||
...
|
||||
void get_htimer_info(struct tep_handle *tep, struct tep_record *record)
|
||||
{
|
||||
struct tep_format_field *field;
|
||||
struct tep_event *event;
|
||||
long long softexpires;
|
||||
int mode;
|
||||
int pid;
|
||||
|
||||
event = tep_find_event_by_name(tep, "timer", "hrtimer_start");
|
||||
|
||||
field = tep_find_common_field(event, "common_pid");
|
||||
if (field == NULL) {
|
||||
/* Cannot find "common_pid" field in the event */
|
||||
} else {
|
||||
/* Get pid from the data record */
|
||||
pid = tep_read_number(tep, record->data + field->offset,
|
||||
field->size);
|
||||
}
|
||||
|
||||
field = tep_find_field(event, "softexpires");
|
||||
if (field == NULL) {
|
||||
/* Cannot find "softexpires" event specific field in the event */
|
||||
} else {
|
||||
/* Get softexpires parameter from the data record */
|
||||
softexpires = tep_read_number(tep, record->data + field->offset,
|
||||
field->size);
|
||||
}
|
||||
|
||||
field = tep_find_any_field(event, "mode");
|
||||
if (field == NULL) {
|
||||
/* Cannot find "mode" field in the event */
|
||||
} else
|
||||
{
|
||||
/* Get mode parameter from the data record */
|
||||
mode = tep_read_number(tep, record->data + field->offset,
|
||||
field->size);
|
||||
}
|
||||
}
|
||||
...
|
||||
--
|
||||
|
||||
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*.
|
||||
*Tzvetomir Stoyanov* <tz.stoyanov@gmail.com>, author of this man page.
|
||||
--
|
||||
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/linux/kernel/git/torvalds/linux.git
|
||||
@@ -1,122 +0,0 @@
|
||||
libtraceevent(3)
|
||||
================
|
||||
|
||||
NAME
|
||||
----
|
||||
tep_get_any_field_val, tep_get_common_field_val, tep_get_field_val,
|
||||
tep_get_field_raw - Get value of a field.
|
||||
|
||||
SYNOPSIS
|
||||
--------
|
||||
[verse]
|
||||
--
|
||||
*#include <event-parse.h>*
|
||||
*#include <trace-seq.h>*
|
||||
|
||||
int *tep_get_any_field_val*(struct trace_seq pass:[*]_s_, struct tep_event pass:[*]_event_, const char pass:[*]_name_, struct tep_record pass:[*]_record_, unsigned long long pass:[*]_val_, int _err_);
|
||||
int *tep_get_common_field_val*(struct trace_seq pass:[*]_s_, struct tep_event pass:[*]_event_, const char pass:[*]_name_, struct tep_record pass:[*]_record_, unsigned long long pass:[*]_val_, int _err_);
|
||||
int *tep_get_field_val*(struct trace_seq pass:[*]_s_, struct tep_event pass:[*]_event_, const char pass:[*]_name_, struct tep_record pass:[*]_record_, unsigned long long pass:[*]_val_, int _err_);
|
||||
void pass:[*]*tep_get_field_raw*(struct trace_seq pass:[*]_s_, struct tep_event pass:[*]_event_, const char pass:[*]_name_, struct tep_record pass:[*]_record_, int pass:[*]_len_, int _err_);
|
||||
--
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
These functions can be used to find a field and retrieve its value.
|
||||
|
||||
The _tep_get_any_field_val()_ function searches in the _record_ for a field
|
||||
with _name_, part of the _event_. If the field is found, its value is stored in
|
||||
_val_. If there is an error and _err_ is not zero, then an error string is
|
||||
written into _s_.
|
||||
|
||||
The _tep_get_common_field_val()_ function does the same as
|
||||
_tep_get_any_field_val()_, but searches only in the common fields. This works
|
||||
for any event as all events include the common fields.
|
||||
|
||||
The _tep_get_field_val()_ function does the same as _tep_get_any_field_val()_,
|
||||
but searches only in the event specific fields.
|
||||
|
||||
The _tep_get_field_raw()_ function searches in the _record_ for a field with
|
||||
_name_, part of the _event_. If the field is found, a pointer to where the field
|
||||
exists in the record's raw data is returned. The size of the data is stored in
|
||||
_len_. If there is an error and _err_ is not zero, then an error string is
|
||||
written into _s_.
|
||||
|
||||
RETURN VALUE
|
||||
------------
|
||||
The _tep_get_any_field_val()_, _tep_get_common_field_val()_ and
|
||||
_tep_get_field_val()_ functions return 0 on success, or -1 in case of an error.
|
||||
|
||||
The _tep_get_field_raw()_ function returns a pointer to field's raw data, and
|
||||
places the length of this data in _len_. In case of an error NULL is returned.
|
||||
|
||||
EXAMPLE
|
||||
-------
|
||||
[source,c]
|
||||
--
|
||||
#include <event-parse.h>
|
||||
#include <trace-seq.h>
|
||||
...
|
||||
struct tep_handle *tep = tep_alloc();
|
||||
...
|
||||
struct tep_event *event = tep_find_event_by_name(tep, "kvm", "kvm_exit");
|
||||
...
|
||||
void process_record(struct tep_record *record)
|
||||
{
|
||||
int len;
|
||||
char *comm;
|
||||
struct tep_event_format *event;
|
||||
unsigned long long val;
|
||||
|
||||
event = tep_find_event_by_record(pevent, record);
|
||||
if (event != NULL) {
|
||||
if (tep_get_common_field_val(NULL, event, "common_type",
|
||||
record, &val, 0) == 0) {
|
||||
/* Got the value of common type field */
|
||||
}
|
||||
if (tep_get_field_val(NULL, event, "pid", record, &val, 0) == 0) {
|
||||
/* Got the value of pid specific field */
|
||||
}
|
||||
comm = tep_get_field_raw(NULL, event, "comm", record, &len, 0);
|
||||
if (comm != NULL) {
|
||||
/* Got a pointer to the comm event specific field */
|
||||
}
|
||||
}
|
||||
}
|
||||
--
|
||||
|
||||
FILES
|
||||
-----
|
||||
[verse]
|
||||
--
|
||||
*event-parse.h*
|
||||
Header file to include in order to have access to the library APIs.
|
||||
*trace-seq.h*
|
||||
Header file to include in order to have access to trace sequences
|
||||
related APIs. Trace sequences are used to allow a function to call
|
||||
several other functions to create a string of data to use.
|
||||
*-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*.
|
||||
*Tzvetomir Stoyanov* <tz.stoyanov@gmail.com>, author of this man page.
|
||||
--
|
||||
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/linux/kernel/git/torvalds/linux.git
|
||||
@@ -1,126 +0,0 @@
|
||||
libtraceevent(3)
|
||||
================
|
||||
|
||||
NAME
|
||||
----
|
||||
tep_print_field, tep_print_fields, tep_print_num_field, tep_print_func_field -
|
||||
Print the field content.
|
||||
|
||||
SYNOPSIS
|
||||
--------
|
||||
[verse]
|
||||
--
|
||||
*#include <event-parse.h>*
|
||||
*#include <trace-seq.h>*
|
||||
|
||||
void *tep_print_field*(struct trace_seq pass:[*]_s_, void pass:[*]_data_, struct tep_format_field pass:[*]_field_);
|
||||
void *tep_print_fields*(struct trace_seq pass:[*]_s_, void pass:[*]_data_, int _size_, struct tep_event pass:[*]_event_);
|
||||
int *tep_print_num_field*(struct trace_seq pass:[*]_s_, const char pass:[*]_fmt_, struct tep_event pass:[*]_event_, const char pass:[*]_name_, struct tep_record pass:[*]_record_, int _err_);
|
||||
int *tep_print_func_field*(struct trace_seq pass:[*]_s_, const char pass:[*]_fmt_, struct tep_event pass:[*]_event_, const char pass:[*]_name_, struct tep_record pass:[*]_record_, int _err_);
|
||||
--
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
These functions print recorded field's data, according to the field's type.
|
||||
|
||||
The _tep_print_field()_ function extracts from the recorded raw _data_ value of
|
||||
the _field_ and prints it into _s_, according to the field type.
|
||||
|
||||
The _tep_print_fields()_ prints each field name followed by the record's field
|
||||
value according to the field's type:
|
||||
[verse]
|
||||
--
|
||||
"field1_name=field1_value field2_name=field2_value ..."
|
||||
--
|
||||
It iterates all fields of the _event_, and calls _tep_print_field()_ for each of
|
||||
them.
|
||||
|
||||
The _tep_print_num_field()_ function prints a numeric field with given format
|
||||
string. A search is performed in the _event_ for a field with _name_. If such
|
||||
field is found, its value is extracted from the _record_ and is printed in the
|
||||
_s_, according to the given format string _fmt_. If the argument _err_ is
|
||||
non-zero, and an error occures - it is printed in the _s_.
|
||||
|
||||
The _tep_print_func_field()_ function prints a function field with given format
|
||||
string. A search is performed in the _event_ for a field with _name_. If such
|
||||
field is found, its value is extracted from the _record_. The value is assumed
|
||||
to be a function address, and a search is perform to find the name of this
|
||||
function. The function name (if found) and its address are printed in the _s_,
|
||||
according to the given format string _fmt_. If the argument _err_ is non-zero,
|
||||
and an error occures - it is printed in _s_.
|
||||
|
||||
RETURN VALUE
|
||||
------------
|
||||
The _tep_print_num_field()_ and _tep_print_func_field()_ functions return 1
|
||||
on success, -1 in case of an error or 0 if the print buffer _s_ is full.
|
||||
|
||||
EXAMPLE
|
||||
-------
|
||||
[source,c]
|
||||
--
|
||||
#include <event-parse.h>
|
||||
#include <trace-seq.h>
|
||||
...
|
||||
struct tep_handle *tep = tep_alloc();
|
||||
...
|
||||
struct trace_seq seq;
|
||||
trace_seq_init(&seq);
|
||||
struct tep_event *event = tep_find_event_by_name(tep, "timer", "hrtimer_start");
|
||||
...
|
||||
void process_record(struct tep_record *record)
|
||||
{
|
||||
struct tep_format_field *field_pid = tep_find_common_field(event, "common_pid");
|
||||
|
||||
trace_seq_reset(&seq);
|
||||
|
||||
/* Print the value of "common_pid" */
|
||||
tep_print_field(&seq, record->data, field_pid);
|
||||
|
||||
/* Print all fields of the "hrtimer_start" event */
|
||||
tep_print_fields(&seq, record->data, record->size, event);
|
||||
|
||||
/* Print the value of "expires" field with custom format string */
|
||||
tep_print_num_field(&seq, " timer expires in %llu ", event, "expires", record, 0);
|
||||
|
||||
/* Print the address and the name of "function" field with custom format string */
|
||||
tep_print_func_field(&seq, " timer function is %s ", event, "function", record, 0);
|
||||
}
|
||||
...
|
||||
--
|
||||
|
||||
FILES
|
||||
-----
|
||||
[verse]
|
||||
--
|
||||
*event-parse.h*
|
||||
Header file to include in order to have access to the library APIs.
|
||||
*trace-seq.h*
|
||||
Header file to include in order to have access to trace sequences related APIs.
|
||||
Trace sequences are used to allow a function to call several other functions
|
||||
to create a string of data to use.
|
||||
*-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*.
|
||||
*Tzvetomir Stoyanov* <tz.stoyanov@gmail.com>, author of this man page.
|
||||
--
|
||||
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/linux/kernel/git/torvalds/linux.git
|
||||
@@ -1,81 +0,0 @@
|
||||
libtraceevent(3)
|
||||
================
|
||||
|
||||
NAME
|
||||
----
|
||||
tep_read_number_field - Reads a number from raw data.
|
||||
|
||||
SYNOPSIS
|
||||
--------
|
||||
[verse]
|
||||
--
|
||||
*#include <event-parse.h>*
|
||||
|
||||
int *tep_read_number_field*(struct tep_format_field pass:[*]_field_, const void pass:[*]_data_, unsigned long long pass:[*]_value_);
|
||||
--
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
The _tep_read_number_field()_ function reads the value of the _field_ from the
|
||||
raw _data_ and stores it in the _value_. The function sets the _value_ according
|
||||
to the endianness of the raw data and the current machine and stores it in
|
||||
_value_.
|
||||
|
||||
RETURN VALUE
|
||||
------------
|
||||
The _tep_read_number_field()_ function retunrs 0 in case of success, or -1 in
|
||||
case of an error.
|
||||
|
||||
EXAMPLE
|
||||
-------
|
||||
[source,c]
|
||||
--
|
||||
#include <event-parse.h>
|
||||
...
|
||||
struct tep_handle *tep = tep_alloc();
|
||||
...
|
||||
struct tep_event *event = tep_find_event_by_name(tep, "timer", "hrtimer_start");
|
||||
...
|
||||
void process_record(struct tep_record *record)
|
||||
{
|
||||
unsigned long long pid;
|
||||
struct tep_format_field *field_pid = tep_find_common_field(event, "common_pid");
|
||||
|
||||
if (tep_read_number_field(field_pid, record->data, &pid) != 0) {
|
||||
/* Failed to get "common_pid" value */
|
||||
}
|
||||
}
|
||||
...
|
||||
--
|
||||
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*.
|
||||
*Tzvetomir Stoyanov* <tz.stoyanov@gmail.com>, author of this man page.
|
||||
--
|
||||
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/linux/kernel/git/torvalds/linux.git
|
||||
@@ -1,105 +0,0 @@
|
||||
libtraceevent(3)
|
||||
================
|
||||
|
||||
NAME
|
||||
----
|
||||
tep_event_common_fields, tep_event_fields - Get a list of fields for an event.
|
||||
|
||||
SYNOPSIS
|
||||
--------
|
||||
[verse]
|
||||
--
|
||||
*#include <event-parse.h>*
|
||||
|
||||
struct tep_format_field pass:[*]pass:[*]*tep_event_common_fields*(struct tep_event pass:[*]_event_);
|
||||
struct tep_format_field pass:[*]pass:[*]*tep_event_fields*(struct tep_event pass:[*]_event_);
|
||||
--
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
The _tep_event_common_fields()_ function returns an array of pointers to common
|
||||
fields for the _event_. The array is allocated in the function and must be freed
|
||||
by free(). The last element of the array is NULL.
|
||||
|
||||
The _tep_event_fields()_ function returns an array of pointers to event specific
|
||||
fields for the _event_. The array is allocated in the function and must be freed
|
||||
by free(). The last element of the array is NULL.
|
||||
|
||||
RETURN VALUE
|
||||
------------
|
||||
Both _tep_event_common_fields()_ and _tep_event_fields()_ functions return
|
||||
an array of pointers to tep_format_field structures in case of success, or
|
||||
NULL in case of an error.
|
||||
|
||||
EXAMPLE
|
||||
-------
|
||||
[source,c]
|
||||
--
|
||||
#include <event-parse.h>
|
||||
...
|
||||
struct tep_handle *tep = tep_alloc();
|
||||
...
|
||||
int i;
|
||||
struct tep_format_field **fields;
|
||||
struct tep_event *event = tep_find_event_by_name(tep, "kvm", "kvm_exit");
|
||||
if (event != NULL) {
|
||||
fields = tep_event_common_fields(event);
|
||||
if (fields != NULL) {
|
||||
i = 0;
|
||||
while (fields[i]) {
|
||||
/*
|
||||
walk through the list of the common fields
|
||||
of the kvm_exit event
|
||||
*/
|
||||
i++;
|
||||
}
|
||||
free(fields);
|
||||
}
|
||||
fields = tep_event_fields(event);
|
||||
if (fields != NULL) {
|
||||
i = 0;
|
||||
while (fields[i]) {
|
||||
/*
|
||||
walk through the list of the event specific
|
||||
fields of the kvm_exit event
|
||||
*/
|
||||
i++;
|
||||
}
|
||||
free(fields);
|
||||
}
|
||||
}
|
||||
...
|
||||
--
|
||||
|
||||
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*.
|
||||
*Tzvetomir Stoyanov* <tz.stoyanov@gmail.com>, author of this man page.
|
||||
--
|
||||
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/linux/kernel/git/torvalds/linux.git
|
||||
@@ -1,91 +0,0 @@
|
||||
libtraceevent(3)
|
||||
================
|
||||
|
||||
NAME
|
||||
----
|
||||
tep_is_file_bigendian, tep_set_file_bigendian - Get / set the endianness of the
|
||||
raw data being accessed by the tep handler.
|
||||
|
||||
SYNOPSIS
|
||||
--------
|
||||
[verse]
|
||||
--
|
||||
*#include <event-parse.h>*
|
||||
|
||||
enum *tep_endian* {
|
||||
TEP_LITTLE_ENDIAN = 0,
|
||||
TEP_BIG_ENDIAN
|
||||
};
|
||||
|
||||
bool *tep_is_file_bigendian*(struct tep_handle pass:[*]_tep_);
|
||||
void *tep_set_file_bigendian*(struct tep_handle pass:[*]_tep_, enum tep_endian _endian_);
|
||||
|
||||
--
|
||||
DESCRIPTION
|
||||
-----------
|
||||
The _tep_is_file_bigendian()_ function gets the endianness of the raw data,
|
||||
being accessed by the tep handler. The _tep_ argument is trace event parser
|
||||
context.
|
||||
|
||||
The _tep_set_file_bigendian()_ function sets the endianness of raw data being
|
||||
accessed by the tep handler. The _tep_ argument is trace event parser context.
|
||||
[verse]
|
||||
--
|
||||
The _endian_ argument is the endianness:
|
||||
_TEP_LITTLE_ENDIAN_ - the raw data is in little endian format,
|
||||
_TEP_BIG_ENDIAN_ - the raw data is in big endian format.
|
||||
--
|
||||
RETURN VALUE
|
||||
------------
|
||||
The _tep_is_file_bigendian()_ function returns true if the data is in bigendian
|
||||
format, false otherwise.
|
||||
|
||||
EXAMPLE
|
||||
-------
|
||||
[source,c]
|
||||
--
|
||||
#include <event-parse.h>
|
||||
...
|
||||
struct tep_handle *tep = tep_alloc();
|
||||
...
|
||||
tep_set_file_bigendian(tep, TEP_LITTLE_ENDIAN);
|
||||
...
|
||||
if (tep_is_file_bigendian(tep)) {
|
||||
/* The raw data is in big endian */
|
||||
} else {
|
||||
/* The raw data is in little endian */
|
||||
}
|
||||
--
|
||||
|
||||
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*.
|
||||
*Tzvetomir Stoyanov* <tz.stoyanov@gmail.com>, author of this man page.
|
||||
--
|
||||
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/linux/kernel/git/torvalds/linux.git
|
||||
@@ -1,209 +0,0 @@
|
||||
libtraceevent(3)
|
||||
================
|
||||
|
||||
NAME
|
||||
----
|
||||
tep_filter_alloc, tep_filter_free, tep_filter_reset, tep_filter_make_string,
|
||||
tep_filter_copy, tep_filter_compare, tep_filter_match, tep_event_filtered,
|
||||
tep_filter_remove_event, tep_filter_strerror, tep_filter_add_filter_str -
|
||||
Event filter related APIs.
|
||||
|
||||
SYNOPSIS
|
||||
--------
|
||||
[verse]
|
||||
--
|
||||
*#include <event-parse.h>*
|
||||
|
||||
struct tep_event_filter pass:[*]*tep_filter_alloc*(struct tep_handle pass:[*]_tep_);
|
||||
void *tep_filter_free*(struct tep_event_filter pass:[*]_filter_);
|
||||
void *tep_filter_reset*(struct tep_event_filter pass:[*]_filter_);
|
||||
enum tep_errno *tep_filter_add_filter_str*(struct tep_event_filter pass:[*]_filter_, const char pass:[*]_filter_str_);
|
||||
int *tep_event_filtered*(struct tep_event_filter pass:[*]_filter_, int _event_id_);
|
||||
int *tep_filter_remove_event*(struct tep_event_filter pass:[*]_filter_, int _event_id_);
|
||||
enum tep_errno *tep_filter_match*(struct tep_event_filter pass:[*]_filter_, struct tep_record pass:[*]_record_);
|
||||
int *tep_filter_copy*(struct tep_event_filter pass:[*]_dest_, struct tep_event_filter pass:[*]_source_);
|
||||
int *tep_filter_compare*(struct tep_event_filter pass:[*]_filter1_, struct tep_event_filter pass:[*]_filter2_);
|
||||
char pass:[*]*tep_filter_make_string*(struct tep_event_filter pass:[*]_filter_, int _event_id_);
|
||||
int *tep_filter_strerror*(struct tep_event_filter pass:[*]_filter_, enum tep_errno _err_, char pass:[*]buf, size_t _buflen_);
|
||||
--
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
Filters can be attached to traced events. They can be used to filter out various
|
||||
events when outputting them. Each event can be filtered based on its parameters,
|
||||
described in the event's format file. This set of functions can be used to
|
||||
create, delete, modify and attach event filters.
|
||||
|
||||
The _tep_filter_alloc()_ function creates a new event filter. The _tep_ argument
|
||||
is the trace event parser context.
|
||||
|
||||
The _tep_filter_free()_ function frees an event filter and all resources that it
|
||||
had used.
|
||||
|
||||
The _tep_filter_reset()_ function removes all rules from an event filter and
|
||||
resets it.
|
||||
|
||||
The _tep_filter_add_filter_str()_ function adds a new rule to the _filter_. The
|
||||
_filter_str_ argument is the filter string, that contains the rule.
|
||||
|
||||
The _tep_event_filtered()_ function checks if the event with _event_id_ has
|
||||
_filter_.
|
||||
|
||||
The _tep_filter_remove_event()_ function removes a _filter_ for an event with
|
||||
_event_id_.
|
||||
|
||||
The _tep_filter_match()_ function tests if a _record_ matches given _filter_.
|
||||
|
||||
The _tep_filter_copy()_ function copies a _source_ filter into a _dest_ filter.
|
||||
|
||||
The _tep_filter_compare()_ function compares two filers - _filter1_ and _filter2_.
|
||||
|
||||
The _tep_filter_make_string()_ function constructs a string, displaying
|
||||
the _filter_ contents for given _event_id_.
|
||||
|
||||
The _tep_filter_strerror()_ function copies the _filter_ error buffer into the
|
||||
given _buf_ with the size _buflen_. If the error buffer is empty, in the _buf_
|
||||
is copied a string, describing the error _err_.
|
||||
|
||||
RETURN VALUE
|
||||
------------
|
||||
The _tep_filter_alloc()_ function returns a pointer to the newly created event
|
||||
filter, or NULL in case of an error.
|
||||
|
||||
The _tep_filter_add_filter_str()_ function returns 0 if the rule was
|
||||
successfully added or a negative error code. Use _tep_filter_strerror()_ to see
|
||||
actual error message in case of an error.
|
||||
|
||||
The _tep_event_filtered()_ function returns 1 if the filter is found for given
|
||||
event, or 0 otherwise.
|
||||
|
||||
The _tep_filter_remove_event()_ function returns 1 if the vent was removed, or
|
||||
0 if the event was not found.
|
||||
|
||||
The _tep_filter_match()_ function returns _tep_errno_, according to the result:
|
||||
[verse]
|
||||
--
|
||||
_pass:[TEP_ERRNO__FILTER_MATCH]_ - filter found for event, the record matches.
|
||||
_pass:[TEP_ERRNO__FILTER_MISS]_ - filter found for event, the record does not match.
|
||||
_pass:[TEP_ERRNO__FILTER_NOT_FOUND]_ - no filter found for record's event.
|
||||
_pass:[TEP_ERRNO__NO_FILTER]_ - no rules in the filter.
|
||||
--
|
||||
or any other _tep_errno_, if an error occurred during the test.
|
||||
|
||||
The _tep_filter_copy()_ function returns 0 on success or -1 if not all rules
|
||||
were copied.
|
||||
|
||||
The _tep_filter_compare()_ function returns 1 if the two filters hold the same
|
||||
content, or 0 if they do not.
|
||||
|
||||
The _tep_filter_make_string()_ function returns a string, which must be freed
|
||||
with free(), or NULL in case of an error.
|
||||
|
||||
The _tep_filter_strerror()_ function returns 0 if message was filled
|
||||
successfully, or -1 in case of an error.
|
||||
|
||||
EXAMPLE
|
||||
-------
|
||||
[source,c]
|
||||
--
|
||||
#include <event-parse.h>
|
||||
...
|
||||
struct tep_handle *tep = tep_alloc();
|
||||
...
|
||||
char errstr[200];
|
||||
int ret;
|
||||
|
||||
struct tep_event_filter *filter = tep_filter_alloc(tep);
|
||||
struct tep_event_filter *filter1 = tep_filter_alloc(tep);
|
||||
ret = tep_filter_add_filter_str(filter, "sched/sched_wakeup:target_cpu==1");
|
||||
if(ret < 0) {
|
||||
tep_filter_strerror(filter, ret, errstr, sizeof(errstr));
|
||||
/* Failed to add a new rule to the filter, the error string is in errstr */
|
||||
}
|
||||
if (tep_filter_copy(filter1, filter) != 0) {
|
||||
/* Failed to copy filter in filter1 */
|
||||
}
|
||||
...
|
||||
if (tep_filter_compare(filter, filter1) != 1) {
|
||||
/* Both filters are different */
|
||||
}
|
||||
...
|
||||
void process_record(struct tep_handle *tep, struct tep_record *record)
|
||||
{
|
||||
struct tep_event *event;
|
||||
char *fstring;
|
||||
|
||||
event = tep_find_event_by_record(tep, record);
|
||||
|
||||
if (tep_event_filtered(filter, event->id) == 1) {
|
||||
/* The event has filter */
|
||||
fstring = tep_filter_make_string(filter, event->id);
|
||||
if (fstring != NULL) {
|
||||
/* The filter for the event is in fstring */
|
||||
free(fstring);
|
||||
}
|
||||
}
|
||||
|
||||
switch (tep_filter_match(filter, record)) {
|
||||
case TEP_ERRNO__FILTER_MATCH:
|
||||
/* The filter matches the record */
|
||||
break;
|
||||
case TEP_ERRNO__FILTER_MISS:
|
||||
/* The filter does not match the record */
|
||||
break;
|
||||
case TEP_ERRNO__FILTER_NOT_FOUND:
|
||||
/* No filter found for record's event */
|
||||
break;
|
||||
case TEP_ERRNO__NO_FILTER:
|
||||
/* There are no rules in the filter */
|
||||
break
|
||||
default:
|
||||
/* An error occurred during the test */
|
||||
break;
|
||||
}
|
||||
|
||||
if (tep_filter_remove_event(filter, event->id) == 1) {
|
||||
/* The event was removed from the filter */
|
||||
}
|
||||
}
|
||||
|
||||
...
|
||||
tep_filter_reset(filter);
|
||||
...
|
||||
tep_filter_free(filter);
|
||||
tep_filter_free(filter1);
|
||||
...
|
||||
--
|
||||
|
||||
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*.
|
||||
*Tzvetomir Stoyanov* <tz.stoyanov@gmail.com>, author of this man page.
|
||||
--
|
||||
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/linux/kernel/git/torvalds/linux.git
|
||||
@@ -1,183 +0,0 @@
|
||||
libtraceevent(3)
|
||||
================
|
||||
|
||||
NAME
|
||||
----
|
||||
tep_find_function, tep_find_function_address, tep_set_function_resolver,
|
||||
tep_reset_function_resolver, tep_register_function, tep_register_print_string -
|
||||
function related tep APIs
|
||||
|
||||
SYNOPSIS
|
||||
--------
|
||||
[verse]
|
||||
--
|
||||
*#include <event-parse.h>*
|
||||
|
||||
typedef char pass:[*](*tep_func_resolver_t*)(void pass:[*]_priv_, unsigned long long pass:[*]_addrp_, char pass:[**]_modp_);
|
||||
int *tep_set_function_resolver*(struct tep_handle pass:[*]_tep_, tep_func_resolver_t pass:[*]_func_, void pass:[*]_priv_);
|
||||
void *tep_reset_function_resolver*(struct tep_handle pass:[*]_tep_);
|
||||
const char pass:[*]*tep_find_function*(struct tep_handle pass:[*]_tep_, unsigned long long _addr_);
|
||||
unsigned long long *tep_find_function_address*(struct tep_handle pass:[*]_tep_, unsigned long long _addr_);
|
||||
int *tep_register_function*(struct tep_handle pass:[*]_tep_, char pass:[*]_name_, unsigned long long _addr_, char pass:[*]_mod_);
|
||||
int *tep_register_print_string*(struct tep_handle pass:[*]_tep_, const char pass:[*]_fmt_, unsigned long long _addr_);
|
||||
--
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
Some tools may have already a way to resolve the kernel functions. These APIs
|
||||
allow them to keep using it instead of duplicating all the entries inside.
|
||||
|
||||
The _tep_func_resolver_t_ type is the prototype of the alternative kernel
|
||||
functions resolver. This function receives a pointer to its custom context
|
||||
(set with the _tep_set_function_resolver()_ call ) and the address of a kernel
|
||||
function, which has to be resolved. In case of success, it should return
|
||||
the name of the function and its module (if any) in _modp_.
|
||||
|
||||
The _tep_set_function_resolver()_ function registers _func_ as an alternative
|
||||
kernel functions resolver. The _tep_ argument is trace event parser context.
|
||||
The _priv_ argument is a custom context of the _func_ function. The function
|
||||
resolver is used by the APIs _tep_find_function()_,
|
||||
_tep_find_function_address()_, and _tep_print_func_field()_ to resolve
|
||||
a function address to a function name.
|
||||
|
||||
The _tep_reset_function_resolver()_ function resets the kernel functions
|
||||
resolver to the default function. The _tep_ argument is trace event parser
|
||||
context.
|
||||
|
||||
|
||||
These APIs can be used to find function name and start address, by given
|
||||
address. The given address does not have to be exact, it will select
|
||||
the function that would contain it.
|
||||
|
||||
The _tep_find_function()_ function returns the function name, which contains the
|
||||
given address _addr_. The _tep_ argument is the trace event parser context.
|
||||
|
||||
The _tep_find_function_address()_ function returns the function start address,
|
||||
by given address _addr_. The _addr_ does not have to be exact, it will select
|
||||
the function that would contain it. The _tep_ argument is the trace event
|
||||
parser context.
|
||||
|
||||
The _tep_register_function()_ function registers a function name mapped to an
|
||||
address and (optional) module. This mapping is used in case the function tracer
|
||||
or events have "%pS" parameter in its format string. It is common to pass in
|
||||
the kallsyms function names with their corresponding addresses with this
|
||||
function. The _tep_ argument is the trace event parser context. The _name_ is
|
||||
the name of the function, the string is copied internally. The _addr_ is the
|
||||
start address of the function. The _mod_ is the kernel module the function may
|
||||
be in (NULL for none).
|
||||
|
||||
The _tep_register_print_string()_ function registers a string by the address
|
||||
it was stored in the kernel. Some strings internal to the kernel with static
|
||||
address are passed to certain events. The "%s" in the event's format field
|
||||
which has an address needs to know what string would be at that address. The
|
||||
tep_register_print_string() supplies the parsing with the mapping between kernel
|
||||
addresses and those strings. The _tep_ argument is the trace event parser
|
||||
context. The _fmt_ is the string to register, it is copied internally.
|
||||
The _addr_ is the address the string was located at.
|
||||
|
||||
|
||||
RETURN VALUE
|
||||
------------
|
||||
The _tep_set_function_resolver()_ function returns 0 in case of success, or -1
|
||||
in case of an error.
|
||||
|
||||
The _tep_find_function()_ function returns the function name, or NULL in case
|
||||
it cannot be found.
|
||||
|
||||
The _tep_find_function_address()_ function returns the function start address,
|
||||
or 0 in case it cannot be found.
|
||||
|
||||
The _tep_register_function()_ function returns 0 in case of success. In case of
|
||||
an error -1 is returned, and errno is set to the appropriate error number.
|
||||
|
||||
The _tep_register_print_string()_ function returns 0 in case of success. In case
|
||||
of an error -1 is returned, and errno is set to the appropriate error number.
|
||||
|
||||
EXAMPLE
|
||||
-------
|
||||
[source,c]
|
||||
--
|
||||
#include <event-parse.h>
|
||||
...
|
||||
struct tep_handle *tep = tep_alloc();
|
||||
...
|
||||
char *my_resolve_kernel_addr(void *context,
|
||||
unsigned long long *addrp, char **modp)
|
||||
{
|
||||
struct db *function_database = context;
|
||||
struct symbol *sym = sql_lookup(function_database, *addrp);
|
||||
|
||||
if (!sym)
|
||||
return NULL;
|
||||
|
||||
*modp = sym->module_name;
|
||||
return sym->name;
|
||||
}
|
||||
|
||||
void show_function( unsigned long long addr)
|
||||
{
|
||||
unsigned long long fstart;
|
||||
const char *fname;
|
||||
|
||||
if (tep_set_function_resolver(tep, my_resolve_kernel_addr,
|
||||
function_database) != 0) {
|
||||
/* failed to register my_resolve_kernel_addr */
|
||||
}
|
||||
|
||||
/* These APIs use my_resolve_kernel_addr() to resolve the addr */
|
||||
fname = tep_find_function(tep, addr);
|
||||
fstart = tep_find_function_address(tep, addr);
|
||||
|
||||
/*
|
||||
addr is in function named fname, starting at fstart address,
|
||||
at offset (addr - fstart)
|
||||
*/
|
||||
|
||||
tep_reset_function_resolver(tep);
|
||||
|
||||
}
|
||||
...
|
||||
if (tep_register_function(tep, "kvm_exit",
|
||||
(unsigned long long) 0x12345678, "kvm") != 0) {
|
||||
/* Failed to register kvm_exit address mapping */
|
||||
}
|
||||
...
|
||||
if (tep_register_print_string(tep, "print string",
|
||||
(unsigned long long) 0x87654321, NULL) != 0) {
|
||||
/* Failed to register "print string" address mapping */
|
||||
}
|
||||
...
|
||||
--
|
||||
|
||||
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*.
|
||||
*Tzvetomir Stoyanov* <tz.stoyanov@gmail.com>, author of this man page.
|
||||
--
|
||||
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/linux/kernel/git/torvalds/linux.git
|
||||
@@ -1,88 +0,0 @@
|
||||
libtraceevent(3)
|
||||
================
|
||||
|
||||
NAME
|
||||
----
|
||||
tep_find_function,tep_find_function_address - Find function name / start address.
|
||||
|
||||
SYNOPSIS
|
||||
--------
|
||||
[verse]
|
||||
--
|
||||
*#include <event-parse.h>*
|
||||
|
||||
const char pass:[*]*tep_find_function*(struct tep_handle pass:[*]_tep_, unsigned long long _addr_);
|
||||
unsigned long long *tep_find_function_address*(struct tep_handle pass:[*]_tep_, unsigned long long _addr_);
|
||||
--
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
These functions can be used to find function name and start address, by given
|
||||
address. The given address does not have to be exact, it will select the function
|
||||
that would contain it.
|
||||
|
||||
The _tep_find_function()_ function returns the function name, which contains the
|
||||
given address _addr_. The _tep_ argument is the trace event parser context.
|
||||
|
||||
The _tep_find_function_address()_ function returns the function start address,
|
||||
by given address _addr_. The _addr_ does not have to be exact, it will select the
|
||||
function that would contain it. The _tep_ argument is the trace event parser context.
|
||||
|
||||
RETURN VALUE
|
||||
------------
|
||||
The _tep_find_function()_ function returns the function name, or NULL in case
|
||||
it cannot be found.
|
||||
|
||||
The _tep_find_function_address()_ function returns the function start address,
|
||||
or 0 in case it cannot be found.
|
||||
|
||||
EXAMPLE
|
||||
-------
|
||||
[source,c]
|
||||
--
|
||||
#include <event-parse.h>
|
||||
...
|
||||
struct tep_handle *tep = tep_alloc();
|
||||
...
|
||||
void show_function( unsigned long long addr)
|
||||
{
|
||||
const char *fname = tep_find_function(tep, addr);
|
||||
unsigned long long fstart = tep_find_function_address(tep, addr);
|
||||
|
||||
/* addr is in function named fname, starting at fstart address, at offset (addr - fstart) */
|
||||
}
|
||||
...
|
||||
--
|
||||
|
||||
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*.
|
||||
*Tzvetomir Stoyanov* <tz.stoyanov@gmail.com>, author of this man page.
|
||||
--
|
||||
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/linux/kernel/git/torvalds/linux.git
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user