Mini Shell

Direktori : /usr/share/doc/libtraceevent-doc/
Upload File :
Current File : //usr/share/doc/libtraceevent-doc/libtraceevent-func_apis.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">
/*<![CDATA[*/
var asciidoc = {  // Namespace.

/////////////////////////////////////////////////////////////////////
// Table Of Contents generator
/////////////////////////////////////////////////////////////////////

/* Author: Mihai Bazon, September 2002
 * http://students.infoiasi.ro/~mishoo
 *
 * Table Of Content generator
 * Version: 0.4
 *
 * Feel free to use this script under the terms of the GNU General Public
 * License, as long as you do not remove or alter this notice.
 */

 /* modified by Troy D. Hanson, September 2006. License: GPL */
 /* modified by Stuart Rackham, 2006, 2009. License: GPL */

// toclevels = 1..4.
toc: function (toclevels) {

  function getText(el) {
    var text = "";
    for (var i = el.firstChild; i != null; i = i.nextSibling) {
      if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
        text += i.data;
      else if (i.firstChild != null)
        text += getText(i);
    }
    return text;
  }

  function TocEntry(el, text, toclevel) {
    this.element = el;
    this.text = text;
    this.toclevel = toclevel;
  }

  function tocEntries(el, toclevels) {
    var result = new Array;
    var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
    // 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_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
</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 &lt;event-parse.h&gt;</strong>

typedef char *(<strong>tep_func_resolver_t</strong>)(void *<em>priv</em>, unsigned long long *<em>addrp</em>, char **<em>modp</em>);
int <strong>tep_set_function_resolver</strong>(struct tep_handle *<em>tep</em>, tep_func_resolver_t *<em>func</em>, void *<em>priv</em>);
void <strong>tep_reset_function_resolver</strong>(struct tep_handle *<em>tep</em>);
const char *<strong>tep_find_function</strong>(struct tep_handle *<em>tep</em>, unsigned long long <em>addr</em>);
unsigned long long <strong>tep_find_function_address</strong>(struct tep_handle *<em>tep</em>, unsigned long long <em>addr</em>);
int <strong>tep_register_function</strong>(struct tep_handle *<em>tep</em>, char *<em>name</em>, unsigned long long <em>addr</em>, char *<em>mod</em>);
int <strong>tep_register_print_string</strong>(struct tep_handle *<em>tep</em>, const char *<em>fmt</em>, unsigned long long <em>addr</em>);</pre>
<div class="attribution">
</div></div>
</div>
</div>
<div class="sect1">
<h2 id="_description">DESCRIPTION</h2>
<div class="sectionbody">
<div class="paragraph"><p>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.</p></div>
<div class="paragraph"><p>The <em>tep_func_resolver_t</em> type is the prototype of the alternative kernel
functions resolver. This function receives a pointer to its custom context
(set with the <strong>tep_set_function_resolver()</strong> 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 <em>modp</em>.</p></div>
<div class="paragraph"><p>The <strong>tep_set_function_resolver()</strong> function registers <em>func</em> as an alternative
kernel functions resolver. The <em>tep</em> argument is trace event parser context.
The <em>priv</em> argument is a custom context of the <em>func</em> function. The function
resolver is used by the APIs <strong>tep_find_function()</strong>,
<strong>tep_find_function_address()</strong>, and <strong>tep_print_func_field()</strong> to resolve
a function address to a function name.</p></div>
<div class="paragraph"><p>The <strong>tep_reset_function_resolver()</strong> function resets the kernel functions
resolver to the default function.  The <em>tep</em> argument is trace event parser
context.</p></div>
<div class="paragraph"><p>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.</p></div>
<div class="paragraph"><p>The <strong>tep_find_function()</strong> function returns the function name, which contains the
given address <em>addr</em>. The <em>tep</em> argument is the trace event parser context.</p></div>
<div class="paragraph"><p>The <strong>tep_find_function_address()</strong> function returns the function start address,
by given address <em>addr</em>. The <em>addr</em> does not have to be exact, it will select
the function that would contain it. The <em>tep</em> argument is the trace event
parser context.</p></div>
<div class="paragraph"><p>The <strong>tep_register_function()</strong> 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 <em>tep</em> argument is the trace event parser context. The <em>name</em> is
the name of the function, the string is copied internally. The <em>addr</em> is the
start address of the function. The <em>mod</em> is the kernel module the function may
be in (NULL for none).</p></div>
<div class="paragraph"><p>The <strong>tep_register_print_string()</strong> 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&#8217;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 <em>tep</em> argument is the trace event parser
context. The <em>fmt</em> is the string to register, it is copied internally.
The <em>addr</em> is the address the string was located at.</p></div>
</div>
</div>
<div class="sect1">
<h2 id="_return_value">RETURN VALUE</h2>
<div class="sectionbody">
<div class="paragraph"><p>The <strong>tep_set_function_resolver()</strong> function returns 0 in case of success, or -1
in case of an error.</p></div>
<div class="paragraph"><p>The <strong>tep_find_function()</strong> function returns the function name, or NULL in case
it cannot be found.</p></div>
<div class="paragraph"><p>The <strong>tep_find_function_address()</strong> function returns the function start address,
or 0 in case it cannot be found.</p></div>
<div class="paragraph"><p>The <strong>tep_register_function()</strong> function returns 0 in case of success. In case of
an error -1 is returned, and errno is set to the appropriate error number.</p></div>
<div class="paragraph"><p>The <strong>tep_register_print_string()</strong> function returns 0 in case of success. In case
of an error -1 is returned, and errno is set to the appropriate error number.</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">&lt;event-parse.h&gt;</span>
<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>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="color: #990000">...</span>
<span style="color: #009900">char</span> <span style="color: #990000">*</span><span style="font-weight: bold"><span style="color: #000000">my_resolve_kernel_addr</span></span><span style="color: #990000">(</span><span style="color: #009900">void</span> <span style="color: #990000">*</span>context<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>addrp<span style="color: #990000">,</span> <span style="color: #009900">char</span> <span style="color: #990000">**</span>modp<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">db</span> <span style="color: #990000">*</span>function_database <span style="color: #990000">=</span> context<span style="color: #990000">;</span>
        <span style="font-weight: bold"><span style="color: #0000FF">struct</span></span> <span style="color: #008080">symbol</span> <span style="color: #990000">*</span>sym <span style="color: #990000">=</span> <span style="font-weight: bold"><span style="color: #000000">sql_lookup</span></span><span style="color: #990000">(</span>function_database<span style="color: #990000">,</span> <span style="color: #990000">*</span>addrp<span style="color: #990000">);</span>

        <span style="font-weight: bold"><span style="color: #0000FF">if</span></span> <span style="color: #990000">(!</span>sym<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="color: #990000">*</span>modp <span style="color: #990000">=</span> sym<span style="color: #990000">-&gt;</span>module_name<span style="color: #990000">;</span>
        <span style="font-weight: bold"><span style="color: #0000FF">return</span></span> sym<span style="color: #990000">-&gt;</span>name<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">show_function</span></span><span style="color: #990000">(</span> <span style="color: #009900">unsigned</span> <span style="color: #009900">long</span> <span style="color: #009900">long</span> addr<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> fstart<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>fname<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_set_function_resolver</span></span><span style="color: #990000">(</span>tep<span style="color: #990000">,</span> my_resolve_kernel_addr<span style="color: #990000">,</span>
                                      function_database<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-style: italic"><span style="color: #9A1900">/* failed to register my_resolve_kernel_addr */</span></span>
        <span style="color: #FF0000">}</span>

        <span style="font-style: italic"><span style="color: #9A1900">/* These APIs use my_resolve_kernel_addr() to resolve the addr */</span></span>
        fname <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> addr<span style="color: #990000">);</span>
        fstart <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> addr<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">           addr is in function named fname, starting at fstart address,</span></span>
<span style="font-style: italic"><span style="color: #9A1900">           at offset (addr - fstart)</span></span>
<span style="font-style: italic"><span style="color: #9A1900">        */</span></span>

        <span style="font-weight: bold"><span style="color: #000000">tep_reset_function_resolver</span></span><span style="color: #990000">(</span>tep<span style="color: #990000">);</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_register_function</span></span><span style="color: #990000">(</span>tep<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: #009900">unsigned</span> <span style="color: #009900">long</span> <span style="color: #009900">long</span><span style="color: #990000">)</span> <span style="color: #993399">0x12345678</span><span style="color: #990000">,</span> <span style="color: #FF0000">"kvm"</span><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-style: italic"><span style="color: #9A1900">/* Failed to register kvm_exit address mapping */</span></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_register_print_string</span></span><span style="color: #990000">(</span>tep<span style="color: #990000">,</span> <span style="color: #FF0000">"print string"</span><span style="color: #990000">,</span>
                                <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> <span style="color: #993399">0x87654321</span><span style="color: #990000">,</span> NULL<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-style: italic"><span style="color: #9A1900">/* Failed to register "print string" address mapping */</span></span>
        <span style="color: #FF0000">}</span>
<span style="color: #990000">...</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> &lt;<a href="mailto:rostedt@goodmis.org">rostedt@goodmis.org</a>&gt;, author of <strong>libtraceevent</strong>.
<strong>Tzvetomir Stoyanov</strong> &lt;<a href="mailto:tz.stoyanov@gmail.com">tz.stoyanov@gmail.com</a>&gt;, author of this man page.</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  &lt;<a href="mailto:linux-trace-devel@vger.kernel.org">linux-trace-devel@vger.kernel.org</a>&gt;</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
 2022-03-24 23:40:51 UTC
</div>
</div>
</body>
</html>

Zerion Mini Shell 1.0