| DIR: /usr/share/doc/libtraceevent-doc /usr/share/doc/libtraceevent-doc/ |
| Current File : /usr/share/doc/libtraceevent-doc/libtraceevent-kvm-plugin.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>tep_plugin_kvm_get_func, tep_plugin_kvm_put_func -
Add function name for instruction pointer of kvm plugin
</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 <event-parse.h></strong>
const char *<strong>tep_plugin_kvm_get_func</strong>(struct tep_event *event,
struct tep_record *record,
unsigned long long *paddr);
void <strong>tep_plugin_kvm_put_func</strong>(const char *func);</pre>
<div class="attribution">
</div></div>
</div>
</div>
<div class="sect1">
<h2 id="_description">DESCRIPTION</h2>
<div class="sectionbody">
<div class="paragraph"><p>The functions <strong>tep_plugin_kvm_get_func()</strong> and <strong>tep_plugin_kvm_put_func()</strong>
are not to be called by an application, but instead are to be defined by
an application.</p></div>
<div class="paragraph"><p>Certain events (like kvm_exit and kvm_entry) have the instruction pointer
of where in the guest the context changed from guest to host. As the host
only knows the instruction pointer and does not have information about what
function in the guest that instruction pointer belongs to, it can only print
the address.</p></div>
<div class="paragraph"><p>But the application may have more information about the guest, and know where
the guest was when the exit occurred, and also even know the function name
of that address.</p></div>
<div class="paragraph"><p>The KVM plugin for libtraceevent is called on these events, and then calls
<strong>tep_plugin_kvm_get_func()</strong> to see if that function can resolve the instruction
pointer address to a real function name. If the return is non NULL, it will
print the function in the output for that event.</p></div>
<div class="paragraph"><p>These functions are currently defined as weak functions within the plugin, as
to not require them to be defined elsewhere. For an application to override
the weak function, it will need to define the function in a file that gets
compiled with <strong>-rdynamic</strong>. That will tell the dynamic linker to examine that
object file and use function names to resolve weak functions in other shared
objects (in this case the KVM plugin shared object).</p></div>
<div class="paragraph"><p>If the application defines <strong>tep_plugin_kvm_get_func()</strong>, it must use the above
prototype. The <em>event</em> will hold the KVM event that has the instruction pointer
field. The <em>record</em> will be the instance of that event. The application’s function
does not need to use these parameters, but they may be useful for finding the
function name for the address. The <em>paddr</em> is a pointer to a 64 bit value (where
only 32 bits may be used on 32 bit machines). This value is the instruction
pointer to look up. If the application knows the start address of the function
as well, it can set <em>paddr</em> to that address, and the KVM plugin will also
append a "+offset" to the function name where the offset is the original
value in <em>paddr</em> minus the value in <em>paddr</em> when it is called. Finally,
the application should return the function name as a nul terminated string
if one is found.</p></div>
<div class="paragraph"><p>If the returned string of <strong>tep_plugin_kvm_get_func()</strong> was allocated, the KVM plugin
will call <strong>tep_plugin_kvm_put_func()</strong> when it is through with it, passing the
value returned by <strong>tep_plugin_kvm_get_func()</strong> as <em>func</em>. This allows the application
to free it if necessary.</p></div>
</div>
</div>
<div class="sect1">
<h2 id="_return_value">RETURN VALUE</h2>
<div class="sectionbody">
<div class="paragraph"><p>The <strong>tep_plugin_kvm_get_func()</strong> is not to be called by the application but instead
is to be defined by the application. It should return a nul terminated string representing
the function for the given instruction pointer passed to it by reference in <em>paddr</em>. It
can then optionally update the <em>paddr</em> to a value that holds the start of the function.
The string returned may be freed by the <strong>tep_plugin_kvm_put_func()</strong> that the application
should define to clean up the string.</p></div>
<div class="paragraph"><p>The below example needs to be compiled with the <strong>-rdynamic</strong> flag so that the dynamic
linker can resolve the <strong>tep_plugin_kvm_get_func()</strong> and <strong>tep_plugin_kvm_put_func()</strong> functions.</p></div>
<div class="paragraph"><p>When run against a trace.dat file produced by <strong>trace-cmd(1)</strong> recording the kvm_exit and
kvm_entry events on a guest, and then the guest’s /proc/kallsyms file is passed as the
second parameter, the output produced will look something like:</p></div>
<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>CPU <span style="color: #993399">0</span><span style="color: #990000">/</span>KVM<span style="color: #990000">-</span><span style="color: #993399">20407</span> <span style="color: #993399">83156.177626</span> <span style="color: #990000">[</span><span style="color: #993399">000</span><span style="color: #990000">]</span> kvm_exit <span style="color: #008080">reason</span> APIC_ACCESS rip <span style="color: #993399">0xffffffffb0056ee2</span> <span style="color: #008080">exit</span> native_apic_mem_write<span style="color: #990000">+</span><span style="color: #993399">0x2</span> info 10b0 <span style="color: #993399">0</span>
CPU <span style="color: #993399">0</span><span style="color: #990000">/</span>KVM<span style="color: #990000">-</span><span style="color: #993399">20407</span> <span style="color: #993399">83156.177632</span> <span style="color: #990000">[</span><span style="color: #993399">000</span><span style="color: #990000">]</span> kvm_entry vcpu <span style="color: #993399">0</span> rip <span style="color: #993399">0xffffffffb0056ee8</span> <span style="color: #008080">enter</span> native_apic_mem_write<span style="color: #990000">+</span><span style="color: #993399">0x8</span></tt></pre></div></div>
<div class="paragraph"><p>But without those callbacks, it would look like:</p></div>
<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>CPU <span style="color: #993399">0</span><span style="color: #990000">/</span>KVM<span style="color: #990000">-</span><span style="color: #993399">20407</span> <span style="color: #993399">83156.177626</span> <span style="color: #990000">[</span><span style="color: #993399">000</span><span style="color: #990000">]</span> kvm_exit <span style="color: #008080">reason</span> APIC_ACCESS rip <span style="color: #993399">0xffffffffb0056ee2</span> info 10b0 <span style="color: #993399">0</span>
CPU <span style="color: #993399">0</span><span style="color: #990000">/</span>KVM<span style="color: #990000">-</span><span style="color: #993399">20407</span> <span style="color: #993399">83156.177632</span> <span style="color: #990000">[</span><span style="color: #993399">000</span><span style="color: #990000">]</span> kvm_entry vcpu <span style="color: #993399">0</span> rip <span style="color: #993399">0xffffffffb0056ee8</span></tt></pre></div></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"><event-parse.h></span>
<span style="font-weight: bold"><span style="color: #000080">#include</span></span> <span style="color: #FF0000"><trace-cmd.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: #0000FF">static</span></span> <span style="font-weight: bold"><span style="color: #0000FF">struct</span></span> <span style="color: #008080">tep_handle</span> <span style="color: #990000">*</span>tep<span style="color: #990000">;</span>
<span style="font-weight: bold"><span style="color: #0000FF">const</span></span> <span style="color: #009900">char</span> <span style="color: #990000">*</span><span style="font-weight: bold"><span style="color: #000000">tep_plugin_kvm_get_func</span></span><span style="color: #990000">(</span><span style="font-weight: bold"><span style="color: #0000FF">struct</span></span> <span style="color: #008080">tep_event</span> <span style="color: #990000">*</span>event<span style="color: #990000">,</span> <span style="font-weight: bold"><span style="color: #0000FF">struct</span></span> <span style="color: #008080">tep_record</span> <span style="color: #990000">*</span>record<span style="color: #990000">,</span>
<span style="color: #009900">unsigned</span> <span style="color: #009900">long</span> <span style="color: #009900">long</span> <span style="color: #990000">*</span>paddr<span style="color: #990000">)</span>
<span style="color: #FF0000">{</span>
<span style="font-weight: bold"><span style="color: #0000FF">const</span></span> <span style="color: #009900">char</span> <span style="color: #990000">*</span>func<span style="color: #990000">;</span>
<span style="color: #009900">char</span> <span style="color: #990000">*</span>event_func<span style="color: #990000">;</span>
<span style="color: #009900">char</span> <span style="color: #990000">*</span>ename<span style="color: #990000">;</span>
func <span style="color: #990000">=</span> <span style="font-weight: bold"><span style="color: #000000">tep_find_function</span></span><span style="color: #990000">(</span>tep<span style="color: #990000">,</span> <span style="color: #990000">*</span>paddr<span style="color: #990000">);</span>
<span style="font-weight: bold"><span style="color: #0000FF">if</span></span> <span style="color: #990000">(!</span>func<span style="color: #990000">)</span>
<span style="font-weight: bold"><span style="color: #0000FF">return</span></span> NULL<span style="color: #990000">;</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">strcmp</span></span><span style="color: #990000">(</span>event<span style="color: #990000">-></span>name<span style="color: #990000">,</span> <span style="color: #FF0000">"kvm_exit"</span><span style="color: #990000">)</span> <span style="color: #990000">==</span> <span style="color: #993399">0</span><span style="color: #990000">)</span>
ename <span style="color: #990000">=</span> <span style="color: #FF0000">"exit"</span><span style="color: #990000">;</span>
<span style="font-weight: bold"><span style="color: #0000FF">else</span></span>
ename <span style="color: #990000">=</span> <span style="color: #FF0000">"enter"</span><span style="color: #990000">;</span>
<span style="font-style: italic"><span style="color: #9A1900">/*</span></span>
<span style="font-style: italic"><span style="color: #9A1900"> * Normally, passing back func directly is sufficient and then</span></span>
<span style="font-style: italic"><span style="color: #9A1900"> * tep_plugin_kvm_put_func() would not be required. But this example</span></span>
<span style="font-style: italic"><span style="color: #9A1900"> * is showing how to handle allocation of the returned string.</span></span>
<span style="font-style: italic"><span style="color: #9A1900"> */</span></span>
event_func <span style="color: #990000">=</span> <span style="font-weight: bold"><span style="color: #000000">malloc</span></span><span style="color: #990000">(</span><span style="font-weight: bold"><span style="color: #000000">strlen</span></span><span style="color: #990000">(</span>ename<span style="color: #990000">)</span> <span style="color: #990000">+</span> <span style="font-weight: bold"><span style="color: #000000">strlen</span></span><span style="color: #990000">(</span>func<span style="color: #990000">)</span> <span style="color: #990000">+</span> <span style="color: #993399">2</span><span style="color: #990000">);</span>
<span style="font-weight: bold"><span style="color: #0000FF">if</span></span> <span style="color: #990000">(!</span>event_func<span style="color: #990000">)</span>
<span style="font-weight: bold"><span style="color: #0000FF">return</span></span> NULL<span style="color: #990000">;</span>
<span style="font-weight: bold"><span style="color: #000000">sprintf</span></span><span style="color: #990000">(</span>event_func<span style="color: #990000">,</span> <span style="color: #FF0000">"%s %s"</span><span style="color: #990000">,</span> ename<span style="color: #990000">,</span> func<span style="color: #990000">);</span>
<span style="color: #990000">*</span>paddr <span style="color: #990000">=</span> <span style="font-weight: bold"><span style="color: #000000">tep_find_function_address</span></span><span style="color: #990000">(</span>tep<span style="color: #990000">,</span> <span style="color: #990000">*</span>paddr<span style="color: #990000">);</span>
<span style="font-weight: bold"><span style="color: #0000FF">return</span></span> event_func<span style="color: #990000">;</span>
<span style="color: #FF0000">}</span>
<span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">tep_plugin_kvm_put_func</span></span><span style="color: #990000">(</span><span style="font-weight: bold"><span style="color: #0000FF">const</span></span> <span style="color: #009900">char</span> <span style="color: #990000">*</span>func<span style="color: #990000">)</span>
<span style="color: #FF0000">{</span>
<span style="color: #009900">char</span> <span style="color: #990000">*</span>f <span style="color: #990000">=</span> <span style="color: #990000">(</span><span style="color: #009900">char</span> <span style="color: #990000">*)</span>func<span style="color: #990000">;</span>
<span style="font-weight: bold"><span style="color: #000000">free</span></span><span style="color: #990000">(</span>f<span style="color: #990000">);</span>
<span style="color: #FF0000">}</span>
<span style="font-weight: bold"><span style="color: #0000FF">static</span></span> <span style="color: #009900">int</span> <span style="font-weight: bold"><span style="color: #000000">show_event</span></span><span style="color: #990000">(</span><span style="font-weight: bold"><span style="color: #0000FF">struct</span></span> <span style="color: #008080">tracecmd_input</span> <span style="color: #990000">*</span>handle<span style="color: #990000">,</span> <span style="font-weight: bold"><span style="color: #0000FF">struct</span></span> <span style="color: #008080">tep_event</span> <span style="color: #990000">*</span>event<span style="color: #990000">,</span>
<span style="font-weight: bold"><span style="color: #0000FF">struct</span></span> <span style="color: #008080">tep_record</span> <span style="color: #990000">*</span>record<span style="color: #990000">,</span> <span style="color: #009900">int</span> cpu<span style="color: #990000">,</span> <span style="color: #009900">void</span> <span style="color: #990000">*</span>data<span style="color: #990000">)</span>
<span style="color: #FF0000">{</span>
<span style="font-weight: bold"><span style="color: #0000FF">static</span></span> <span style="font-weight: bold"><span style="color: #0000FF">struct</span></span> <span style="color: #008080">trace_seq</span> seq<span style="color: #990000">;</span>
tep <span style="color: #990000">=</span> data<span style="color: #990000">;</span>
<span style="font-weight: bold"><span style="color: #0000FF">if</span></span> <span style="color: #990000">(!</span>seq<span style="color: #990000">.</span>buffer<span style="color: #990000">)</span>
<span style="font-weight: bold"><span style="color: #000000">trace_seq_init</span></span><span style="color: #990000">(&</span>seq<span style="color: #990000">);</span>
<span style="font-weight: bold"><span style="color: #000000">trace_seq_reset</span></span><span style="color: #990000">(&</span>seq<span style="color: #990000">);</span>
<span style="font-weight: bold"><span style="color: #000000">tep_print_event</span></span><span style="color: #990000">(</span><span style="font-weight: bold"><span style="color: #000000">tracecmd_get_tep</span></span><span style="color: #990000">(</span>handle<span style="color: #990000">),</span> <span style="color: #990000">&</span>seq<span style="color: #990000">,</span> record<span style="color: #990000">,</span>
<span style="color: #FF0000">"%s-%d</span><span style="color: #CC33CC">\t</span><span style="color: #FF0000">%6.1000d [%03d] %s</span><span style="color: #CC33CC">\t</span><span style="color: #FF0000">%s</span><span style="color: #CC33CC">\n</span><span style="color: #FF0000">"</span><span style="color: #990000">,</span>
TEP_PRINT_COMM<span style="color: #990000">,</span> TEP_PRINT_PID<span style="color: #990000">,</span>
TEP_PRINT_TIME<span style="color: #990000">,</span> TEP_PRINT_CPU<span style="color: #990000">,</span>
TEP_PRINT_NAME<span style="color: #990000">,</span> TEP_PRINT_INFO<span style="color: #990000">);</span>
<span style="font-weight: bold"><span style="color: #000000">trace_seq_terminate</span></span><span style="color: #990000">(&</span>seq<span style="color: #990000">);</span>
<span style="font-weight: bold"><span style="color: #000000">trace_seq_do_printf</span></span><span style="color: #990000">(&</span>seq<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>
<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="font-weight: bold"><span style="color: #0000FF">struct</span></span> <span style="color: #008080">tracecmd_input</span> <span style="color: #990000">*</span>handle<span style="color: #990000">;</span>
<span style="font-weight: bold"><span style="color: #0000FF">struct</span></span> <span style="color: #008080">tep_handle</span> <span style="color: #990000">*</span>guest_tep<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: #008080">FILE</span> <span style="color: #990000">*</span>fp<span style="color: #990000">;</span>
<span style="color: #009900">char</span> <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>argc <span style="color: #990000"><</span> <span style="color: #993399">3</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: trace.dat guest_kallsyms_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">1</span><span style="color: #990000">);</span>
<span style="color: #FF0000">}</span>
handle <span style="color: #990000">=</span> <span style="font-weight: bold"><span style="color: #000000">tracecmd_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> <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>handle<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>
<span style="font-style: italic"><span style="color: #9A1900">/* Just for kallsyms parsing */</span></span>
guest_tep <span style="color: #990000">=</span> <span style="font-weight: bold"><span style="color: #000000">tep_alloc</span></span><span style="color: #990000">();</span>
<span style="font-weight: bold"><span style="color: #0000FF">if</span></span> <span style="color: #990000">(!</span>guest_tep<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="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">2</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>argv<span style="color: #990000">[</span><span style="color: #993399">2</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="color: #993399">1</span><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="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>
fp <span style="color: #990000">=</span> <span style="font-weight: bold"><span style="color: #000000">fopen</span></span><span style="color: #990000">(</span>argv<span style="color: #990000">[</span><span style="color: #993399">2</span><span style="color: #990000">],</span> <span style="color: #FF0000">"r"</span><span style="color: #990000">);</span>
<span style="font-weight: bold"><span style="color: #0000FF">if</span></span> <span style="color: #990000">(!</span>fp<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">2</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">fread</span></span><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="color: #993399">1</span><span style="color: #990000">,</span> fp<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>argv<span style="color: #990000">[</span><span style="color: #993399">2</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>st<span style="color: #990000">.</span>st_size<span style="color: #990000">]</span> <span style="color: #990000">=</span> <span style="color: #FF0000">'</span><span style="color: #CC33CC">\0</span><span style="color: #FF0000">'</span><span style="color: #990000">;</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">tep_parse_kallsyms</span></span><span style="color: #990000">(</span>guest_tep<span style="color: #990000">,</span> buf<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">printf</span></span><span style="color: #990000">(</span><span style="color: #FF0000">"Failed to parse %s</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">2</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">free</span></span><span style="color: #990000">(</span>buf<span style="color: #990000">);</span>
<span style="font-weight: bold"><span style="color: #000000">tracecmd_follow_event</span></span><span style="color: #990000">(</span>handle<span style="color: #990000">,</span> <span style="color: #FF0000">"kvm"</span><span style="color: #990000">,</span> <span style="color: #FF0000">"kvm_exit"</span><span style="color: #990000">,</span> show_event<span style="color: #990000">,</span> guest_tep<span style="color: #990000">);</span>
<span style="font-weight: bold"><span style="color: #000000">tracecmd_follow_event</span></span><span style="color: #990000">(</span>handle<span style="color: #990000">,</span> <span style="color: #FF0000">"kvm"</span><span style="color: #990000">,</span> <span style="color: #FF0000">"kvm_entry"</span><span style="color: #990000">,</span> show_event<span style="color: #990000">,</span> guest_tep<span style="color: #990000">);</span>
<span style="font-weight: bold"><span style="color: #000000">tracecmd_iterate_events</span></span><span style="color: #990000">(</span>handle<span style="color: #990000">,</span> NULL<span style="color: #990000">,</span> <span style="color: #993399">0</span><span style="color: #990000">,</span> NULL<span style="color: #990000">,</span> NULL<span style="color: #990000">);</span>
<span style="font-weight: bold"><span style="color: #000000">tep_free</span></span><span style="color: #990000">(</span>guest_tep<span style="color: #990000">);</span>
<span style="font-weight: bold"><span style="color: #000000">tracecmd_close</span></span><span style="color: #990000">(</span>handle<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="_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>
|