| DIR: /usr/share/doc/libtraceevent-doc /usr/share/doc/libtraceevent-doc/ |
| Current File : /usr/share/doc/libtraceevent-doc/libtraceevent-kbuffer-create.html |
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
<meta name="generator" content="AsciiDoc 9.1.0" />
<title>libtraceevent(3)</title>
<style type="text/css">
/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
/* Default font. */
body {
font-family: Georgia,serif;
}
/* Title font. */
h1, h2, h3, h4, h5, h6,
div.title, caption.title,
thead, p.table.header,
#toctitle,
#author, #revnumber, #revdate, #revremark,
#footer {
font-family: Arial,Helvetica,sans-serif;
}
body {
margin: 1em 5% 1em 5%;
}
a {
color: blue;
text-decoration: underline;
}
a:visited {
color: fuchsia;
}
em {
font-style: italic;
color: navy;
}
strong {
font-weight: bold;
color: #083194;
}
h1, h2, h3, h4, h5, h6 {
color: #527bbd;
margin-top: 1.2em;
margin-bottom: 0.5em;
line-height: 1.3;
}
h1, h2, h3 {
border-bottom: 2px solid silver;
}
h2 {
padding-top: 0.5em;
}
h3 {
float: left;
}
h3 + * {
clear: left;
}
h5 {
font-size: 1.0em;
}
div.sectionbody {
margin-left: 0;
}
hr {
border: 1px solid silver;
}
p {
margin-top: 0.5em;
margin-bottom: 0.5em;
}
ul, ol, li > p {
margin-top: 0;
}
ul > li { color: #aaa; }
ul > li > * { color: black; }
.monospaced, code, pre {
font-family: "Courier New", Courier, monospace;
font-size: inherit;
color: navy;
padding: 0;
margin: 0;
}
pre {
white-space: pre-wrap;
}
#author {
color: #527bbd;
font-weight: bold;
font-size: 1.1em;
}
#email {
}
#revnumber, #revdate, #revremark {
}
#footer {
font-size: small;
border-top: 2px solid silver;
padding-top: 0.5em;
margin-top: 4.0em;
}
#footer-text {
float: left;
padding-bottom: 0.5em;
}
#footer-badges {
float: right;
padding-bottom: 0.5em;
}
#preamble {
margin-top: 1.5em;
margin-bottom: 1.5em;
}
div.imageblock, div.exampleblock, div.verseblock,
div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
div.admonitionblock {
margin-top: 1.0em;
margin-bottom: 1.5em;
}
div.admonitionblock {
margin-top: 2.0em;
margin-bottom: 2.0em;
margin-right: 10%;
color: #606060;
}
div.content { /* Block element content. */
padding: 0;
}
/* Block element titles. */
div.title, caption.title {
color: #527bbd;
font-weight: bold;
text-align: left;
margin-top: 1.0em;
margin-bottom: 0.5em;
}
div.title + * {
margin-top: 0;
}
td div.title:first-child {
margin-top: 0.0em;
}
div.content div.title:first-child {
margin-top: 0.0em;
}
div.content + div.title {
margin-top: 0.0em;
}
div.sidebarblock > div.content {
background: #ffffee;
border: 1px solid #dddddd;
border-left: 4px solid #f0f0f0;
padding: 0.5em;
}
div.listingblock > div.content {
border: 1px solid #dddddd;
border-left: 5px solid #f0f0f0;
background: #f8f8f8;
padding: 0.5em;
}
div.quoteblock, div.verseblock {
padding-left: 1.0em;
margin-left: 1.0em;
margin-right: 10%;
border-left: 5px solid #f0f0f0;
color: #888;
}
div.quoteblock > div.attribution {
padding-top: 0.5em;
text-align: right;
}
div.verseblock > pre.content {
font-family: inherit;
font-size: inherit;
}
div.verseblock > div.attribution {
padding-top: 0.75em;
text-align: left;
}
/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
div.verseblock + div.attribution {
text-align: left;
}
div.admonitionblock .icon {
vertical-align: top;
font-size: 1.1em;
font-weight: bold;
text-decoration: underline;
color: #527bbd;
padding-right: 0.5em;
}
div.admonitionblock td.content {
padding-left: 0.5em;
border-left: 3px solid #dddddd;
}
div.exampleblock > div.content {
border-left: 3px solid #dddddd;
padding-left: 0.5em;
}
div.imageblock div.content { padding-left: 0; }
span.image img { border-style: none; vertical-align: text-bottom; }
a.image:visited { color: white; }
dl {
margin-top: 0.8em;
margin-bottom: 0.8em;
}
dt {
margin-top: 0.5em;
margin-bottom: 0;
font-style: normal;
color: navy;
}
dd > *:first-child {
margin-top: 0.1em;
}
ul, ol {
list-style-position: outside;
}
ol.arabic {
list-style-type: decimal;
}
ol.loweralpha {
list-style-type: lower-alpha;
}
ol.upperalpha {
list-style-type: upper-alpha;
}
ol.lowerroman {
list-style-type: lower-roman;
}
ol.upperroman {
list-style-type: upper-roman;
}
div.compact ul, div.compact ol,
div.compact p, div.compact p,
div.compact div, div.compact div {
margin-top: 0.1em;
margin-bottom: 0.1em;
}
tfoot {
font-weight: bold;
}
td > div.verse {
white-space: pre;
}
div.hdlist {
margin-top: 0.8em;
margin-bottom: 0.8em;
}
div.hdlist tr {
padding-bottom: 15px;
}
dt.hdlist1.strong, td.hdlist1.strong {
font-weight: bold;
}
td.hdlist1 {
vertical-align: top;
font-style: normal;
padding-right: 0.8em;
color: navy;
}
td.hdlist2 {
vertical-align: top;
}
div.hdlist.compact tr {
margin: 0;
padding-bottom: 0;
}
.comment {
background: yellow;
}
.footnote, .footnoteref {
font-size: 0.8em;
}
span.footnote, span.footnoteref {
vertical-align: super;
}
#footnotes {
margin: 20px 0 20px 0;
padding: 7px 0 0 0;
}
#footnotes div.footnote {
margin: 0 0 5px 0;
}
#footnotes hr {
border: none;
border-top: 1px solid silver;
height: 1px;
text-align: left;
margin-left: 0;
width: 20%;
min-width: 100px;
}
div.colist td {
padding-right: 0.5em;
padding-bottom: 0.3em;
vertical-align: top;
}
div.colist td img {
margin-top: 0.3em;
}
@media print {
#footer-badges { display: none; }
}
#toc {
margin-bottom: 2.5em;
}
#toctitle {
color: #527bbd;
font-size: 1.1em;
font-weight: bold;
margin-top: 1.0em;
margin-bottom: 0.1em;
}
div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
margin-top: 0;
margin-bottom: 0;
}
div.toclevel2 {
margin-left: 2em;
font-size: 0.9em;
}
div.toclevel3 {
margin-left: 4em;
font-size: 0.9em;
}
div.toclevel4 {
margin-left: 6em;
font-size: 0.9em;
}
span.aqua { color: aqua; }
span.black { color: black; }
span.blue { color: blue; }
span.fuchsia { color: fuchsia; }
span.gray { color: gray; }
span.green { color: green; }
span.lime { color: lime; }
span.maroon { color: maroon; }
span.navy { color: navy; }
span.olive { color: olive; }
span.purple { color: purple; }
span.red { color: red; }
span.silver { color: silver; }
span.teal { color: teal; }
span.white { color: white; }
span.yellow { color: yellow; }
span.aqua-background { background: aqua; }
span.black-background { background: black; }
span.blue-background { background: blue; }
span.fuchsia-background { background: fuchsia; }
span.gray-background { background: gray; }
span.green-background { background: green; }
span.lime-background { background: lime; }
span.maroon-background { background: maroon; }
span.navy-background { background: navy; }
span.olive-background { background: olive; }
span.purple-background { background: purple; }
span.red-background { background: red; }
span.silver-background { background: silver; }
span.teal-background { background: teal; }
span.white-background { background: white; }
span.yellow-background { background: yellow; }
span.big { font-size: 2em; }
span.small { font-size: 0.6em; }
span.underline { text-decoration: underline; }
span.overline { text-decoration: overline; }
span.line-through { text-decoration: line-through; }
div.unbreakable { page-break-inside: avoid; }
/*
* xhtml11 specific
*
* */
div.tableblock {
margin-top: 1.0em;
margin-bottom: 1.5em;
}
div.tableblock > table {
border: 3px solid #527bbd;
}
thead, p.table.header {
font-weight: bold;
color: #527bbd;
}
p.table {
margin-top: 0;
}
/* Because the table frame attribute is overridden by CSS in most browsers. */
div.tableblock > table[frame="void"] {
border-style: none;
}
div.tableblock > table[frame="hsides"] {
border-left-style: none;
border-right-style: none;
}
div.tableblock > table[frame="vsides"] {
border-top-style: none;
border-bottom-style: none;
}
/*
* html5 specific
*
* */
table.tableblock {
margin-top: 1.0em;
margin-bottom: 1.5em;
}
thead, p.tableblock.header {
font-weight: bold;
color: #527bbd;
}
p.tableblock {
margin-top: 0;
}
table.tableblock {
border-width: 3px;
border-spacing: 0px;
border-style: solid;
border-color: #527bbd;
border-collapse: collapse;
}
th.tableblock, td.tableblock {
border-width: 1px;
padding: 4px;
border-style: solid;
border-color: #527bbd;
}
table.tableblock.frame-topbot {
border-left-style: hidden;
border-right-style: hidden;
}
table.tableblock.frame-sides {
border-top-style: hidden;
border-bottom-style: hidden;
}
table.tableblock.frame-none {
border-style: hidden;
}
th.tableblock.halign-left, td.tableblock.halign-left {
text-align: left;
}
th.tableblock.halign-center, td.tableblock.halign-center {
text-align: center;
}
th.tableblock.halign-right, td.tableblock.halign-right {
text-align: right;
}
th.tableblock.valign-top, td.tableblock.valign-top {
vertical-align: top;
}
th.tableblock.valign-middle, td.tableblock.valign-middle {
vertical-align: middle;
}
th.tableblock.valign-bottom, td.tableblock.valign-bottom {
vertical-align: bottom;
}
/*
* manpage specific
*
* */
body.manpage h1 {
padding-top: 0.5em;
padding-bottom: 0.5em;
border-top: 2px solid silver;
border-bottom: 2px solid silver;
}
body.manpage h2 {
border-style: none;
}
body.manpage div.sectionbody {
margin-left: 3em;
}
@media print {
body.manpage div#toc { display: none; }
}
</style>
<script type="text/javascript">
/*<+'])');
// Function that scans the DOM tree for header elements (the DOM2
// nodeIterator API would be a better technique but not supported by all
// browsers).
var iterate = function (el) {
for (var i = el.firstChild; i != null; i = i.nextSibling) {
if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
var mo = re.exec(i.tagName);
if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
}
iterate(i);
}
}
}
iterate(el);
return result;
}
var toc = document.getElementById("toc");
if (!toc) {
return;
}
// Delete existing TOC entries in case we're reloading the TOC.
var tocEntriesToRemove = [];
var i;
for (i = 0; i < toc.childNodes.length; i++) {
var entry = toc.childNodes[i];
if (entry.nodeName.toLowerCase() == 'div'
&& entry.getAttribute("class")
&& entry.getAttribute("class").match(/^toclevel/))
tocEntriesToRemove.push(entry);
}
for (i = 0; i < tocEntriesToRemove.length; i++) {
toc.removeChild(tocEntriesToRemove[i]);
}
// Rebuild TOC entries.
var entries = tocEntries(document.getElementById("content"), toclevels);
for (var i = 0; i < entries.length; ++i) {
var entry = entries[i];
if (entry.element.id == "")
entry.element.id = "_toc_" + i;
var a = document.createElement("a");
a.href = "#" + entry.element.id;
a.appendChild(document.createTextNode(entry.text));
var div = document.createElement("div");
div.appendChild(a);
div.className = "toclevel" + entry.toclevel;
toc.appendChild(div);
}
if (entries.length == 0)
toc.parentNode.removeChild(toc);
},
/////////////////////////////////////////////////////////////////////
// Footnotes generator
/////////////////////////////////////////////////////////////////////
/* Based on footnote generation code from:
* http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
*/
footnotes: function () {
// Delete existing footnote entries in case we're reloading the footnodes.
var i;
var noteholder = document.getElementById("footnotes");
if (!noteholder) {
return;
}
var entriesToRemove = [];
for (i = 0; i < noteholder.childNodes.length; i++) {
var entry = noteholder.childNodes[i];
if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
entriesToRemove.push(entry);
}
for (i = 0; i < entriesToRemove.length; i++) {
noteholder.removeChild(entriesToRemove[i]);
}
// Rebuild footnote entries.
var cont = document.getElementById("content");
var spans = cont.getElementsByTagName("span");
var refs = {};
var n = 0;
for (i=0; i<spans.length; i++) {
if (spans[i].className == "footnote") {
n++;
var note = spans[i].getAttribute("data-note");
if (!note) {
// Use [\s\S] in place of . so multi-line matches work.
// Because JavaScript has no s (dotall) regex flag.
note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
spans[i].innerHTML =
"[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
"' title='View footnote' class='footnote'>" + n + "</a>]";
spans[i].setAttribute("data-note", note);
}
noteholder.innerHTML +=
"<div class='footnote' id='_footnote_" + n + "'>" +
"<a href='#_footnoteref_" + n + "' title='Return to text'>" +
n + "</a>. " + note + "</div>";
var id =spans[i].getAttribute("id");
if (id != null) refs["#"+id] = n;
}
}
if (n == 0)
noteholder.parentNode.removeChild(noteholder);
else {
// Process footnoterefs.
for (i=0; i<spans.length; i++) {
if (spans[i].className == "footnoteref") {
var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
href = href.match(/#.*/)[0]; // Because IE return full URL.
n = refs[href];
spans[i].innerHTML =
"[<a href='#_footnote_" + n +
"' title='View footnote' class='footnote'>" + n + "</a>]";
}
}
}
},
install: function(toclevels) {
var timerId;
function reinstall() {
asciidoc.footnotes();
if (toclevels) {
asciidoc.toc(toclevels);
}
}
function reinstallAndRemoveTimer() {
clearInterval(timerId);
reinstall();
}
timerId = setInterval(reinstall, 500);
if (document.addEventListener)
document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
else
window.onload = reinstallAndRemoveTimer;
}
}
asciidoc.install();
/*]]>*/
</script>
</head>
<body class="manpage">
<div id="header">
<h1>
libtraceevent(3) Manual Page
</h1>
<h2>NAME</h2>
<div class="sectionbody">
<p>kbuffer_alloc, kbuffer_dup, kbuffer_free, kbuffer_load_subbuffer, kbuffer_subbuffer, kbuffer_refresh, kbuffer_subbuffer_size, kbuffer_start_of_data -
Creating of kbuffer element to parse the Linux kernel tracing ring buffer
</p>
</div>
</div>
<div id="content">
<div class="sect1">
<h2 id="_synopsis">SYNOPSIS</h2>
<div class="sectionbody">
<div class="verseblock">
<pre class="content"><strong>#include <kbuffer.h></strong>
enum kbuffer_endian {
KBUFFER_ENDIAN_BIG,
KBUFFER_ENDIAN_LITTLE,
KBUFFER_ENDIAN_SAME_AS_HOST,
};
enum kbuffer_long_size {
KBUFFER_LSIZE_4,
KBUFFER_LSIZE_8,
KBUFFER_LSIZE_SAME_AS_HOST,
};
struct kbuffer;
struct tep_handle;
struct kbuffer *<strong>kbuffer_alloc</strong>(enum kbuffer_long_size <em>size</em>, enum kbuffer_endian <em>endian</em>);
struct kbuffer *<strong>kbuffer_dup</strong>(struct kbuffer *<em>kbuf</em>);
void <strong>kbuffer_free</strong>(struct kbuffer *<em>kbuf</em>);
int <strong>kbuffer_load_subbuffer</strong>(struct kbuffer *<em>kbuf</em>, void *<em>subbuffer</em>);
int <strong>kbuffer_subbuffer_size</strong>(struct kbuffer *<em>kbuf</em>);
int <strong>kbuffer_refresh</strong>(struct kbuffer *<em>kbuf</em>);
int <strong>kbuffer_start_of_data</strong>(struct kbuffer *<em>kbuf</em>);
void *<strong>kbuffer_subbuffer</strong>(struct kbuffer *_kbuf);</pre>
<div class="attribution">
</div></div>
</div>
</div>
<div class="sect1">
<h2 id="_description">DESCRIPTION</h2>
<div class="sectionbody">
<div class="paragraph"><p>These functions create a <em>kbuffer</em> handle that can be used to parse the raw sub buffers
of the Linux kernel tracing ring buffer. The ring buffer is found in the tracefs
directory, and can be retrieved by <strong>tracefs_instance_get_file(3)</strong> at
<strong>per_cpu/cpuX/trace_pipe_raw</strong> where <strong>X</strong> is replaced by the per CPU number of
the specified ring buffer. The ring buffer inside the kernel is split up per
CPU, such that the raw ring buffer must be retrieved per CPU as well.</p></div>
<div class="paragraph"><p>The <strong>kbuffer_alloc()</strong> will create a descriptor that can be used to manage a sub buffer
read by the ring buffer. The <em>size</em> parameter denotes what the word size is
for the given buffer (note, this works from reading raw data from machines other
than the machine that is calling this function). The <em>endian</em> denotes the endian
for the machine.</p></div>
<div class="paragraph"><p>If <em>endian</em> is set to <em>KBUFFER_ENDIAN_SAME_AS_HOST</em> the endian will be set to the same
as the host endianess, which is useful when the application is reading the
ring buffer data directly from the same machine it is running on.</p></div>
<div class="paragraph"><p>If <em>size</em> is set to <em>KBUFFER_LSIZE_SAME_AS_HOST</em>, if the word size is 8, it will
set the kbuffer descriptor to long size of 8. But if the size is 4, then it
will then perform a <strong>uname(2)</strong> call, and if the <em>machine</em> field has the string "64"
in it, it will be set to 8 byte long size and not 4 byte. This is because the
ring buffer long size is dependent on the kernel and not user space.</p></div>
<div class="paragraph"><p>The <strong>kbuffer_dup()</strong> function will duplicate an existing kbuffer structure with
an allocated new one. It will have all the properties of the passed in <em>kbuf</em>,
including pointing to the same subbuffer that was loaded in the <em>kbuf</em>.
It must be freed with <strong>kbuffer_free()</strong>.</p></div>
<div class="paragraph"><p>The <strong>kbuffer_free()</strong> function will free the resources created by <strong>kbuffer_alloc()</strong>.</p></div>
<div class="paragraph"><p>The <strong>kbuffer_load_subbuffer()</strong> will take a <em>subbuffer</em> which is a raw data blob
from the tracefs <strong>trace_pipe_raw</strong> file. The Linux tracing ring buffer is broken up
into sub buffers. Each sub buffer is as stand alone data segment that has all the
information to split out the individual events and time stamps. This sub buffer
is what kbuffer uses to walk the events.</p></div>
<div class="paragraph"><p>The <strong>kbuffer_subbuffer_size()</strong> returns the location of the end of the last event
on the sub-buffer. It does not return the size of the sub-buffer itself.</p></div>
<div class="paragraph"><p>The <strong>kbuffer_refresh()</strong> is to be used if more writes were done on the loaded kbuffer
where the size of the kbuffer needs to be refreshed to be able to read the new
events that were written since the last <strong>kbuffer_load_subbuffer()</strong> was called on it.</p></div>
<div class="paragraph"><p>Note, no memory barriers are implemented with this function and any synchronization
with the writer is the responsibility of the application.</p></div>
<div class="paragraph"><p>The <strong>kbuffer_start_of_data()</strong> function returns the offset of where the actual
data load of the sub-buffer begins.</p></div>
<div class="paragraph"><p>The <strong>kbuffer_subbuffer()</strong> function returns the pointer to the currently loaded
subbuffer. That is, the last subbuffer that was loaded by <strong>kbuffer_load_subbuffer()</strong>.
If no subbuffer was loaded NULL is returned.</p></div>
</div>
</div>
<div class="sect1">
<h2 id="_return_value">RETURN VALUE</h2>
<div class="sectionbody">
<div class="paragraph"><p><strong>kbuffer_alloc()</strong> returns an allocated kbuffer descriptor or NULL on error.
The returned descriptor must be freed with <strong>kbuffer_free()</strong></p></div>
<div class="paragraph"><p><strong>kbuffer_load_subbuffer()</strong> returns 0 on success and -1 on error.</p></div>
<div class="paragraph"><p><strong>kbuffer_subbuffer_size()</strong> returns the index on the subbuffer where the end
of the last event is located.</p></div>
<div class="paragraph"><p><strong>kbuffer_start_of_data()</strong> returns the offset of where the data begins on the
sub-buffer loaded in <em>kbuf</em>.</p></div>
<div class="paragraph"><p><strong>kbuffer_subbuffer()</strong> returns the last loaded subbuffer to <em>kbuf</em> that was loaded
by <strong>kbuffer_load_subbuffer()</strong> or NULL if none was loaded.</p></div>
<div class="paragraph"><p><strong>kbuffer_refresh()</strong> returns 0 on success and -1 if <em>kbuf</em> is NULL or it does not
have a subbuffer loaded via <strong>kbuffer_load_subbuffer()</strong>.</p></div>
</div>
</div>
<div class="sect1">
<h2 id="_example">EXAMPLE</h2>
<div class="sectionbody">
<div class="listingblock">
<div class="content"><!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
<pre><tt><span style="font-weight: bold"><span style="color: #000080">#include</span></span> <span style="color: #FF0000"><stdio.h></span>
<span style="font-weight: bold"><span style="color: #000080">#include</span></span> <span style="color: #FF0000"><stdlib.h></span>
<span style="font-weight: bold"><span style="color: #000080">#include</span></span> <span style="color: #FF0000"><fcntl.h></span>
<span style="font-weight: bold"><span style="color: #000080">#include</span></span> <span style="color: #FF0000"><unistd.h></span>
<span style="font-weight: bold"><span style="color: #000080">#include</span></span> <span style="color: #FF0000"><sys/stat.h></span>
<span style="font-weight: bold"><span style="color: #000080">#include</span></span> <span style="color: #FF0000"><kbuffer.h></span>
<span style="color: #009900">int</span> <span style="font-weight: bold"><span style="color: #000000">main</span></span> <span style="color: #990000">(</span><span style="color: #009900">int</span> argc<span style="color: #990000">,</span> <span style="color: #009900">char</span> <span style="color: #990000">**</span>argv<span style="color: #990000">)</span>
<span style="color: #FF0000">{</span>
<span style="color: #009900">unsigned</span> <span style="color: #009900">long</span> <span style="color: #009900">long</span> ts<span style="color: #990000">;</span>
<span style="font-weight: bold"><span style="color: #0000FF">struct</span></span> <span style="color: #008080">kbuffer</span> <span style="color: #990000">*</span>kbuf<span style="color: #990000">;</span>
<span style="font-weight: bold"><span style="color: #0000FF">struct</span></span> <span style="color: #008080">stat</span> st<span style="color: #990000">;</span>
<span style="color: #009900">char</span> <span style="color: #990000">*</span>buf<span style="color: #990000">;</span>
<span style="color: #009900">void</span> <span style="color: #990000">*</span>event<span style="color: #990000">;</span>
<span style="color: #009900">int</span> ret<span style="color: #990000">;</span>
<span style="color: #009900">int</span> fd<span style="color: #990000">;</span>
<span style="color: #009900">int</span> i <span style="color: #990000">=</span> <span style="color: #993399">0</span><span style="color: #990000">;</span>
<span style="font-weight: bold"><span style="color: #0000FF">if</span></span> <span style="color: #990000">(</span>argc <span style="color: #990000"><</span> <span style="color: #993399">2</span><span style="color: #990000">)</span> <span style="color: #FF0000">{</span>
<span style="font-weight: bold"><span style="color: #000000">printf</span></span><span style="color: #990000">(</span><span style="color: #FF0000">"usage: %s raw-subbuffer-page</span><span style="color: #CC33CC">\n</span><span style="color: #FF0000">"</span><span style="color: #990000">,</span> argv<span style="color: #990000">[</span><span style="color: #993399">0</span><span style="color: #990000">]);</span>
<span style="font-weight: bold"><span style="color: #000000">printf</span></span><span style="color: #990000">(</span><span style="color: #FF0000">" Try: dd count=1 bs=4096 if=/sys/kernel/tracing/per_cpu/cpu0/trace_pipe_raw of=/tmp/file</span><span style="color: #CC33CC">\n</span><span style="color: #FF0000">"</span><span style="color: #990000">);</span>
<span style="font-weight: bold"><span style="color: #000000">exit</span></span><span style="color: #990000">(</span><span style="color: #993399">0</span><span style="color: #990000">);</span>
<span style="color: #FF0000">}</span>
<span style="font-weight: bold"><span style="color: #0000FF">if</span></span> <span style="color: #990000">(</span><span style="font-weight: bold"><span style="color: #000000">stat</span></span><span style="color: #990000">(</span>argv<span style="color: #990000">[</span><span style="color: #993399">1</span><span style="color: #990000">],</span> <span style="color: #990000">&</span>st<span style="color: #990000">)</span> <span style="color: #990000"><</span> <span style="color: #993399">0</span><span style="color: #990000">)</span> <span style="color: #FF0000">{</span>
<span style="font-weight: bold"><span style="color: #000000">perror</span></span><span style="color: #990000">(</span><span style="color: #FF0000">"stat"</span><span style="color: #990000">);</span>
<span style="font-weight: bold"><span style="color: #000000">exit</span></span><span style="color: #990000">(-</span><span style="color: #993399">1</span><span style="color: #990000">);</span>
<span style="color: #FF0000">}</span>
buf <span style="color: #990000">=</span> <span style="font-weight: bold"><span style="color: #000000">malloc</span></span><span style="color: #990000">(</span>st<span style="color: #990000">.</span>st_size<span style="color: #990000">);</span>
<span style="font-weight: bold"><span style="color: #0000FF">if</span></span> <span style="color: #990000">(!</span>buf<span style="color: #990000">)</span> <span style="color: #FF0000">{</span>
<span style="font-weight: bold"><span style="color: #000000">perror</span></span><span style="color: #990000">(</span><span style="color: #FF0000">"Allocating buffer"</span><span style="color: #990000">);</span>
<span style="font-weight: bold"><span style="color: #000000">exit</span></span><span style="color: #990000">(-</span><span style="color: #993399">1</span><span style="color: #990000">);</span>
<span style="color: #FF0000">}</span>
fd <span style="color: #990000">=</span> <span style="font-weight: bold"><span style="color: #000000">open</span></span><span style="color: #990000">(</span>argv<span style="color: #990000">[</span><span style="color: #993399">1</span><span style="color: #990000">],</span> O_RDONLY<span style="color: #990000">);</span>
<span style="font-weight: bold"><span style="color: #0000FF">if</span></span> <span style="color: #990000">(</span>fd <span style="color: #990000"><</span> <span style="color: #993399">0</span><span style="color: #990000">)</span> <span style="color: #FF0000">{</span>
<span style="font-weight: bold"><span style="color: #000000">perror</span></span><span style="color: #990000">(</span>argv<span style="color: #990000">[</span><span style="color: #993399">1</span><span style="color: #990000">]);</span>
<span style="font-weight: bold"><span style="color: #000000">exit</span></span><span style="color: #990000">(-</span><span style="color: #993399">1</span><span style="color: #990000">);</span>
<span style="color: #FF0000">}</span>
ret <span style="color: #990000">=</span> <span style="font-weight: bold"><span style="color: #000000">read</span></span><span style="color: #990000">(</span>fd<span style="color: #990000">,</span> buf<span style="color: #990000">,</span> st<span style="color: #990000">.</span>st_size<span style="color: #990000">);</span>
<span style="font-weight: bold"><span style="color: #0000FF">if</span></span> <span style="color: #990000">(</span>ret <span style="color: #990000"><</span> <span style="color: #993399">0</span><span style="color: #990000">)</span> <span style="color: #FF0000">{</span>
<span style="font-weight: bold"><span style="color: #000000">perror</span></span><span style="color: #990000">(</span><span style="color: #FF0000">"Reading buffer"</span><span style="color: #990000">);</span>
<span style="font-weight: bold"><span style="color: #000000">exit</span></span><span style="color: #990000">(-</span><span style="color: #993399">1</span><span style="color: #990000">);</span>
<span style="color: #FF0000">}</span>
<span style="font-weight: bold"><span style="color: #000000">close</span></span><span style="color: #990000">(</span>fd<span style="color: #990000">);</span>
kbuf <span style="color: #990000">=</span> <span style="font-weight: bold"><span style="color: #000000">kbuffer_alloc</span></span><span style="color: #990000">(</span>KBUFFER_ENDIAN_SAME_AS_HOST<span style="color: #990000">,</span>
KBUFFER_LSIZE_SAME_AS_HOST<span style="color: #990000">);</span>
<span style="font-weight: bold"><span style="color: #0000FF">if</span></span> <span style="color: #990000">(!</span>kbuf<span style="color: #990000">)</span> <span style="color: #FF0000">{</span>
<span style="font-weight: bold"><span style="color: #000000">perror</span></span><span style="color: #990000">(</span><span style="color: #FF0000">"Creating kbuffer"</span><span style="color: #990000">);</span>
<span style="font-weight: bold"><span style="color: #000000">exit</span></span><span style="color: #990000">(-</span><span style="color: #993399">1</span><span style="color: #990000">);</span>
<span style="color: #FF0000">}</span>
ret <span style="color: #990000">=</span> <span style="font-weight: bold"><span style="color: #000000">kbuffer_load_subbuffer</span></span><span style="color: #990000">(</span>kbuf<span style="color: #990000">,</span> buf<span style="color: #990000">);</span>
<span style="font-weight: bold"><span style="color: #0000FF">if</span></span> <span style="color: #990000">(</span>ret <span style="color: #990000"><</span> <span style="color: #993399">0</span><span style="color: #990000">)</span> <span style="color: #FF0000">{</span>
<span style="font-weight: bold"><span style="color: #000000">perror</span></span><span style="color: #990000">(</span><span style="color: #FF0000">"Loading sub bufer"</span><span style="color: #990000">);</span>
<span style="font-weight: bold"><span style="color: #000000">exit</span></span><span style="color: #990000">(-</span><span style="color: #993399">1</span><span style="color: #990000">);</span>
<span style="color: #FF0000">}</span>
<span style="font-weight: bold"><span style="color: #0000FF">if</span></span> <span style="color: #990000">(</span><span style="font-weight: bold"><span style="color: #000000">kbuffer_subbuffer_size</span></span><span style="color: #990000">(</span>kbuf<span style="color: #990000">)</span> <span style="color: #990000">></span> st<span style="color: #990000">.</span>st_size<span style="color: #990000">)</span> <span style="color: #FF0000">{</span>
<span style="font-weight: bold"><span style="color: #000000">fprintf</span></span><span style="color: #990000">(</span>stderr<span style="color: #990000">,</span> <span style="color: #FF0000">"kbuffer is bigger than raw size %d > %ld</span><span style="color: #CC33CC">\n</span><span style="color: #FF0000">"</span><span style="color: #990000">,</span>
<span style="font-weight: bold"><span style="color: #000000">kbuffer_subbuffer_size</span></span><span style="color: #990000">(</span>kbuf<span style="color: #990000">),</span> st<span style="color: #990000">.</span>st_size<span style="color: #990000">);</span>
<span style="font-weight: bold"><span style="color: #000000">exit</span></span><span style="color: #990000">(-</span><span style="color: #993399">1</span><span style="color: #990000">);</span>
<span style="color: #FF0000">}</span>
<span style="font-weight: bold"><span style="color: #000000">printf</span></span><span style="color: #990000">(</span><span style="color: #FF0000">"Kbuffer data starts at %d</span><span style="color: #CC33CC">\n</span><span style="color: #FF0000">"</span><span style="color: #990000">,</span> <span style="font-weight: bold"><span style="color: #000000">kbuffer_start_of_data</span></span><span style="color: #990000">(</span>kbuf<span style="color: #990000">));</span>
<span style="font-weight: bold"><span style="color: #0000FF">do</span></span> <span style="color: #FF0000">{</span>
event <span style="color: #990000">=</span> <span style="font-weight: bold"><span style="color: #000000">kbuffer_read_event</span></span><span style="color: #990000">(</span>kbuf<span style="color: #990000">,</span> <span style="color: #990000">&</span>ts<span style="color: #990000">);</span>
<span style="font-weight: bold"><span style="color: #0000FF">if</span></span> <span style="color: #990000">(</span>event<span style="color: #990000">)</span> <span style="color: #FF0000">{</span>
<span style="font-weight: bold"><span style="color: #000000">printf</span></span><span style="color: #990000">(</span><span style="color: #FF0000">" event %3d ts:%lld</span><span style="color: #CC33CC">\n</span><span style="color: #FF0000">"</span><span style="color: #990000">,</span> i<span style="color: #990000">++,</span> ts<span style="color: #990000">);</span>
event <span style="color: #990000">=</span> <span style="font-weight: bold"><span style="color: #000000">kbuffer_next_event</span></span><span style="color: #990000">(</span>kbuf<span style="color: #990000">,</span> NULL<span style="color: #990000">);</span>
<span style="color: #FF0000">}</span>
<span style="color: #FF0000">}</span> <span style="font-weight: bold"><span style="color: #0000FF">while</span></span> <span style="color: #990000">(</span>event<span style="color: #990000">);</span>
<span style="font-weight: bold"><span style="color: #0000FF">if</span></span> <span style="color: #990000">(!</span>event<span style="color: #990000">)</span>
<span style="font-weight: bold"><span style="color: #000000">printf</span></span><span style="color: #990000">(</span><span style="color: #FF0000">"Finished sub buffer</span><span style="color: #CC33CC">\n</span><span style="color: #FF0000">"</span><span style="color: #990000">);</span>
<span style="font-weight: bold"><span style="color: #000000">kbuffer_free</span></span><span style="color: #990000">(</span>kbuf<span style="color: #990000">);</span>
<span style="font-weight: bold"><span style="color: #0000FF">return</span></span> <span style="color: #993399">0</span><span style="color: #990000">;</span>
<span style="color: #FF0000">}</span></tt></pre></div></div>
</div>
</div>
<div class="sect1">
<h2 id="_files">FILES</h2>
<div class="sectionbody">
<div class="verseblock">
<pre class="content"><strong>event-parse.h</strong>
Header file to include in order to have access to the library APIs.
<strong>-ltraceevent</strong>
Linker switch to add when building a program that uses the library.</pre>
<div class="attribution">
</div></div>
</div>
</div>
<div class="sect1">
<h2 id="_see_also">SEE ALSO</h2>
<div class="sectionbody">
<div class="paragraph"><p><strong>libtraceevent</strong>(3), <strong>trace-cmd</strong>(1)</p></div>
</div>
</div>
<div class="sect1">
<h2 id="_author">AUTHOR</h2>
<div class="sectionbody">
<div class="verseblock">
<pre class="content"><strong>Steven Rostedt</strong> <<a href="mailto:rostedt@goodmis.org">rostedt@goodmis.org</a>>, author of <strong>libtraceevent</strong>.</pre>
<div class="attribution">
</div></div>
</div>
</div>
<div class="sect1">
<h2 id="_reporting_bugs">REPORTING BUGS</h2>
<div class="sectionbody">
<div class="paragraph"><p>Report bugs to <<a href="mailto:linux-trace-devel@vger.kernel.org">linux-trace-devel@vger.kernel.org</a>></p></div>
</div>
</div>
<div class="sect1">
<h2 id="_license">LICENSE</h2>
<div class="sectionbody">
<div class="paragraph"><p>libtraceevent is Free Software licensed under the GNU LGPL 2.1</p></div>
</div>
</div>
<div class="sect1">
<h2 id="_resources">RESOURCES</h2>
<div class="sectionbody">
<div class="paragraph"><p><a href="https://git.kernel.org/pub/scm/libs/libtrace/libtraceevent.git/">https://git.kernel.org/pub/scm/libs/libtrace/libtraceevent.git/</a></p></div>
</div>
</div>
</div>
<div id="footnotes"><hr /></div>
<div id="footer">
<div id="footer-text">
Last updated
2024-10-11 21:26:45 UTC
</div>
</div>
</body>
</html>
|