<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
        {mso-style-priority:99;
        mso-style-link:"Texte de bulles Car";
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:8.0pt;
        font-family:"Tahoma","sans-serif";}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0cm;
        margin-right:0cm;
        margin-bottom:0cm;
        margin-left:36.0pt;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
span.EmailStyle17
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.TextedebullesCar
        {mso-style-name:"Texte de bulles Car";
        mso-style-priority:99;
        mso-style-link:"Texte de bulles";
        font-family:"Tahoma","sans-serif";
        mso-fareast-language:FR-CA;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";
        mso-fareast-language:EN-US;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="FR-CA" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><b><span lang="EN-CA" style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">De :</span></b><span lang="EN-CA" style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> Anand Neeli [mailto:anand.neeli@gmail.com]
<br>
<b>Envoyé :</b> 4 avril 2014 01:45<br>
<br>
</span><span lang="EN-CA"><o:p></o:p></span></p>
<div>
<div>
<p class="MsoNormal"><span lang="EN-CA" style="color:#1F497D">> </span><span lang="EN-CA">Thanks for your reply.<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA" style="color:#1F497D">> </span><span lang="EN-CA">Sorry for my ignorance but how are you generating </span><span lang="EN-CA" style="font-size:10.0pt;font-family:"Arial","sans-serif"">libtp.so in your example?</span><span lang="EN-CA"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA" style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Non-boilerplate parts are in
</span><span lang="EN-CA" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:red">red</span><span lang="EN-CA" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA" style="color:red">tp</span><span lang="EN-CA">.c:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">#####<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">/*<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">* Defining macro creates the code objects of the traceprobes.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">* Must be done only once per file (this #define controls tracepoint.h and<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">* tracepoint-event.h).<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">*/<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">#define TRACEPOINT_CREATE_PROBES<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">/*<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">* The header containing our TRACEPOINT_EVENTs.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">*/<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">#include "<span style="color:red">tp</span>.h"<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">#####<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="color:red">tp</span><span lang="EN-CA">.h:<br>
#####<br>
#undef TRACEPOINT_PROVIDER<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">#define TRACEPOINT_PROVIDER <span style="color:red">
sample_component</span><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">/*<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">* include file (this files's name)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">*/<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">#undef TRACEPOINT_INCLUDE<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">#define TRACEPOINT_INCLUDE "./<span style="color:red">tp</span>.h"<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">/*<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">* Add this precompiler conditional to ensure the tracepoint event generation<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">* can include this file more than once.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">*/<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">#if !defined(_<span style="color:red">SAMPLE_COMPONENT</span>_PROVIDER_H) || defined(TRACEPOINT_HEADER_MULTI_READ)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">#define _<span style="color:red">SAMPLE_COMPONENT</span>_PROVIDER_H<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">/*<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">* Add this to allow programs to call "tracepoint(...)".<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">* This #include must not be within an extern "C" block; if it is,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">* C++ instrumentation will fail when SystemTap is also installed.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">* (This may have been fixed since I wrote this)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">*/<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">#include <lttng/tracepoint.h><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">/*<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">* Add this macro and its matching element to make sure the program<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">* works in C++.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">*/<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">#ifdef __cplusplus<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">extern "C" {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">#endif /* __cplusplus */<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">/*<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">* The following tracepoint event writes a message (C string) into the<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">* field "message" of the trace event "event" in the provider<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">* "sample_component" in other words:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">*<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">*    sample_component:event:message = text.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">*/<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">TRACEPOINT_EVENT(<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">            /*<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">            * provider name, not a variable but a string starting with a letter<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">            * and containing either letters, numbers or underscores.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">            * Needs to be the same as TRACEPOINT_PROVIDER<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">            */<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">            <span style="color:red">sample_component</span>,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">            /*<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">            * tracepoint name, same format as sample provider. Does not need to be<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">            * declared before. in this case the name is "event"<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">            */<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">            <span style="color:red">event</span>,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">            /*<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">            * TP_ARGS macro contains the arguments passed for the tracepoint.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">            * It is in the following format:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">            *                     TP_ARGS( type1, name1, type2, name2, ... type10, name10)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">            * where there can be from zero to ten elements.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">            * "typeN" is the datatype, such as int, struct or double **.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">            * "name" is the variable name (in "int myInt" the name would be "myInt")<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">            *                     TP_ARGS() is valid (no arguments)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">            *                     TP_ARGS( void ) is valid too<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">            */<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">            TP_ARGS(<span style="color:red">const char *, text</span>),<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">            /*<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">            * TP_FIELDS describes how to write the fields of the trace event.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">            * You can use the args here<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">            */<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">            TP_FIELDS(<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">            /*<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">            * The ctf_string macro takes a C string and writes it into a field<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">            * named "message"<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">            */<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">                        <span style="color:red">
ctf_string(message, text)<o:p></o:p></span></span></p>
<p class="MsoNormal"><span lang="EN-CA">            )<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">/*<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">* Trace loglevel, shows the level of the trace event. It can be TRACE_EMERG,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">* TRACE_ALERT, TRACE_CRIT, TRACE_ERR, TRACE_WARNING, TRACE_INFO, etc.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">* If this is not set, TRACE_DEFAULT is assumed.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">* The first two arguments identify the tracepoint.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">* See details in <lttng/tracepoint.h> line 347<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">*/<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">TRACEPOINT_LOGLEVEL(<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">       /*<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">        * The provider name, must be the same as the provider name in the<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">        * TRACEPOINT_EVENT and as TRACEPOINT_PROVIDER above.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">        */<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">            <span style="color:red">sample_component</span>,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">       /*<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">        * The tracepoint name, must be the same as the tracepoint name in the<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">        * TRACEPOINT_EVENT<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">        */<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">            <span style="color:red">event</span>,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">       /*<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">        * The tracepoint loglevel. WARNING: Some levels are abbreviated and<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">        * others are not, please see <lttng/tracepoint.h><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">        */<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">            <span style="color:red">TRACE_WARNING<o:p></o:p></span></span></p>
<p class="MsoNormal"><span lang="EN-CA">)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">(more tracepoints…)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">/*<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">* Add this macro and its matching element to make sure the program<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">* works in C++.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">*/<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">#ifdef __cplusplus<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">#endif /* __cplusplus */<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">/*<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">* Add this after defining the tracepoint events to expand the macros.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">*/<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">#include <lttng/tracepoint-event.h><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">#endif /* _<span style="color:red">SAMPLE_COMPONENT</span>_PROVIDER_H */<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">#####<br>
The relevant Makefile fragments:<br>
#####<br>
CC = gcc<br>
<span style="color:#1F497D">LIBUST = -llttng-ust<o:p></o:p></span></span></p>
<p class="MsoNormal"><span lang="EN-CA">LOCAL_CPPFLAGS += -I. $(AM_CPPFLAGS)<br>
LDFLAGS += -L/usr/local/lib $(AM_LDFLAGS)<br>
SOFLAGS = -fPIC<br>
SOVERSION_MAJOR = 1<br>
SOVERSION_MINOR = 0<br>
<br>
<span style="color:#1F497D">libtp.so: libtp.o<o:p></o:p></span></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="color:#1F497D">            @echo "~~~~~~Packaging $@:"<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="color:#1F497D">            $(CC) -shared -Wl,-soname,$@.$(SOVERSION_MAJOR) -Wl,-no-as-needed \<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="color:#1F497D">               -o $@.$(SOVERSION_MAJOR).$(SOVERSION_MINOR) $(LDFLAGS) $(LIBUST) $<<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="color:#1F497D">            ln -sf $@.$(SOVERSION_MAJOR).$(SOVERSION_MINOR) $@.$(SOVERSION_MAJOR)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="color:#1F497D">            ln -sf $@.$(SOVERSION_MAJOR) $@<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="color:#1F497D">libtp.o: tp.c tp.h<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="color:#1F497D">            @echo "~~~~~~Compiling $@:"<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="color:#1F497D">            $(CC) $(CPPFLAGS) $(LOCAL_CPPFLAGS) $(SOFLAGS) -c -o $@ $<<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA"><br>
</span><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">>
</span><span lang="EN-CA" style="font-family:"Arial","sans-serif"">1) Also will this solution scale if my binary depends on lots of libraries which are instrumented?</span><span lang="EN-CA"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA" style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Sure.  I’d expect linear scaling.  Each library, upon being loaded, looks for its tracepoint provider and turns its tracepoints off if they’re
 not found.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">>
</span><span lang="EN-CA" style="font-family:"Arial","sans-serif"">2) i'm fine with linking statically, can we avoid LD_PRELOAD?<span style="color:#1F497D"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">Besides the LD_PRELOAD technique, you could also use LD_LIBRARY_PATH, but that works only if the application statically includes the tracepoint provider (I suppose
 it would likewise work for an instrumented shared object only if it statically includes the tracepoint provider).<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">You could also add "-Wl,-rpath,'$$ORIGIN'" to the linker call to add an RPATH tag to the application (or shared object).  This makes it look for its dependencies
 in its starting directory ($ORIGIN).  RPATH is, unlike RUNPATH, applicable to libraries as well: a library with an RPATH tag will look there for its dependencies; failing its own RPATH, it will use its executable's RPATH.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">Finally, you can dynamically include the tracepoint provider (libtp) as a dependency.  The application (sample_static_aware) is then statically aware of libtp and
 won't run without it.  The application (sample_dynamic) can alternately dynamically include the tracepoint provider
<i>without</i> static awareness.  Here’s how it’s done:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">LIBDL = -ldl # On Linux<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">#LIBDL = -lc # On BSD<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">TP_DEFINE = -D TRACEPOINT_DEFINE<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">TP_DEFINE_DYNAMIC = $(TP_DEFINE) -D TRACEPOINT_PROBE_DYNAMIC_LINKAGE<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">#(the inclusion of a libtp NEEDED tag requires "-no-as-needed -ltp").<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">#Note that "-L. -ltp", when used, should appear before $(LDFLAGS) $(LIBDL).<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">static_aware: static.o libtp.so<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">            @echo "~~~~~~Linking sample_$@:"<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">#          $(CC) -Wl,-no-as-needed -o sample_$@ -L. -ltp $< $(LDFLAGS) $(LIBDL) \<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">#             -Wl,-rpath,'$$ORIGIN',--enable-new-dtags<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">            $(CC) -Wl,-no-as-needed -o sample_$@ -L. -ltp $< $(LDFLAGS) $(LIBDL)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">            @echo "   Use 'LD_PRELOAD=./libtp.so ./sample_$@' to run sample_$@"<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">static.o: sample.c tp.h<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">            @echo "~~~~~~Compiling $@:"<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">            $(CC) $(CPPFLAGS) $(LOCAL_CPPFLAGS) $(TP_DEFINE) -c -o $@ $<<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="color:#1F497D">#If not preloaded, the sample application runs but won't be traceable.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="color:#1F497D">#Putting libtp in the path won't work: the sample does not look for it.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="color:#1F497D">dynamic: dynamic.o libtp.so<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="color:#1F497D">            @echo "~~~~~~Linking sample_$@:"<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="color:#1F497D">            $(CC) -o sample_$@ $< $(LDFLAGS) $(LIBDL)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="color:#1F497D">            @echo "   Use '[LD_PRELOAD=./libtp.so] ./sample_$@' to run sample_$@"<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="color:#1F497D">#Compare with the 'static.o' target.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="color:#1F497D">dynamic.o: sample.c tp.h<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="color:#1F497D">            @echo "~~~~~~Compiling $@:"<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="color:#1F497D">            $(CC) $(CPPFLAGS) $(LOCAL_CPPFLAGS) $(TP_DEFINE_DYNAMIC) \<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="color:#1F497D">               -c -o $@ $<<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">   The case where the app isn’t traced but the library it uses is traced should be a variation on this.  I’ll try it out sometime in the near future,
 but you should be able to figure it out from the above.  Here’s a first guess (it may need $(LIBDL) alongside $(LIBUST)):<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="color:#1F497D">libtp.so: libtp.o<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="color:#1F497D">            @echo "~~~~~~Packaging $@:"<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="color:#1F497D">            $(CC) -shared -Wl,-soname,$@.$(SOVERSION_MAJOR) -Wl,-no-as-needed -L. -ltp \<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="color:#1F497D">               -o $@.$(SOVERSION_MAJOR).$(SOVERSION_MINOR) $(LDFLAGS) $(LIBUST) $<<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="color:#1F497D">            ln -sf $@.$(SOVERSION_MAJOR).$(SOVERSION_MINOR) $@.$(SOVERSION_MAJOR)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="color:#1F497D">            ln -sf $@.$(SOVERSION_MAJOR) $@<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">>
</span><span lang="EN-CA" style="font-family:"Arial","sans-serif"">3) Is there any page which explains on why and how to use<span style="color:#1F497D"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">>
</span><span lang="EN-CA" style="font-family:"Arial","sans-serif"">TRACEPOINT_PROVIDER, TRACEPOINT_CREATE_PROBES, TRACEPOINT_INCLUDE, </span><span lang="EN-CA" style="font-size:10.0pt;font-family:"Arial","sans-serif"">TRACEPOINT_DEFINE, TRACEPOINT_PROBE_DYNAMIC_LINKAGE</span><span lang="EN-CA"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA" style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">They’re reasonably explained in the demonstration apps.  I discuss them a little more in depth in the forthcoming LTTng Comprehensive User’s Guide
 (I could send you a copy of the draft, as we’ve just begun its first review round).<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">>
</span><span lang="EN-CA" style="font-family:"Arial","sans-serif"">my tp.h is, are there any errors in this?</span><span lang="EN-CA"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">>
</span><span lang="EN-CA" style="font-family:"Arial","sans-serif"">#############</span><span lang="EN-CA"><o:p></o:p></span></p>
</div>
<div>
<div>
<p class="MsoNormal"><span lang="EN-CA" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">#undef TRACEPOINT_PROVIDER<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">>
</span><span lang="EN-CA" style="font-family:"Arial","sans-serif"">#define TRACEPOINT_PROVIDER sample_component<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">></span><span lang="EN-CA" style="font-family:"Arial","sans-serif""><o:p> </o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">>
</span><span lang="EN-CA" style="font-family:"Arial","sans-serif"">#undef TRACEPOINT_INCLUDE<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">>
</span><span lang="EN-CA" style="font-family:"Arial","sans-serif"">#define TRACEPOINT_INCLUDE "./tp.h"<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">></span><span lang="EN-CA" style="font-family:"Arial","sans-serif""><o:p> </o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">>
</span><span lang="EN-CA" style="font-family:"Arial","sans-serif"">#if !defined(_TP_H) || defined(TRACEPOINT_HEADER_MULTI_READ)<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">>
</span><span lang="EN-CA" style="font-family:"Arial","sans-serif"">#define _TP_H<span style="color:#1F497D"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">(Ideally, use _SAMPLE_COMPONENT_PROVIDER_H instead of _TP_H)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">>
</span><span lang="EN-CA" style="font-family:"Arial","sans-serif"">#include <lttng/tracepoint.h><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">#ifdef __cplusplus<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">extern "C" {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">#endif /* __cplusplus */<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">>
</span><span lang="EN-CA" style="font-family:"Arial","sans-serif"">TRACEPOINT_EVENT(<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">></span><span lang="EN-CA" style="font-family:"Arial","sans-serif"">        sample_component,<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">></span><span lang="EN-CA" style="font-family:"Arial","sans-serif"">        event,<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">></span><span lang="EN-CA" style="font-family:"Arial","sans-serif"">        TP_ARGS(char *, text),<span style="color:#1F497D"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">(the compiler may be happier with const char * instead)<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">></span><span lang="EN-CA" style="font-family:"Arial","sans-serif"">        TP_FIELDS(<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">></span><span lang="EN-CA" style="font-family:"Arial","sans-serif"">                ctf_string(message, text)<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">></span><span lang="EN-CA" style="font-family:"Arial","sans-serif"">        )<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">></span><span lang="EN-CA" style="font-family:"Arial","sans-serif"">)<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">>
</span><span lang="EN-CA" style="font-family:"Arial","sans-serif"">TRACEPOINT_LOGLEVEL(<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">></span><span lang="EN-CA" style="font-family:"Arial","sans-serif"">        sample_component,<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">></span><span lang="EN-CA" style="font-family:"Arial","sans-serif"">        event,<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">></span><span lang="EN-CA" style="font-family:"Arial","sans-serif"">        TRACE_WARNING)<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">#ifdef __cplusplus<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">#endif /* __cplusplus */<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">>
</span><span lang="EN-CA" style="font-family:"Arial","sans-serif"">#endif /* _TP_H */<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">>
</span><span lang="EN-CA" style="font-family:"Arial","sans-serif"">#include <lttng/tracepoint-event.h><span style="color:#1F497D"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">(move #include <lttng/tracepoint-event.h> inside of the
</span><span lang="EN-CA" style="font-family:"Arial","sans-serif"">#if !defined(_TP_H) || defined(TRACEPOINT_HEADER_MULTI_READ)</span><span lang="EN-CA" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">>
</span><span lang="EN-CA" style="font-family:"Arial","sans-serif"">#############<o:p></o:p></span></p>
</div>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">></span><span lang="EN-CA"><o:p> </o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">>
</span><span lang="EN-CA" style="font-family:"Arial","sans-serif"">Thanks,</span><span lang="EN-CA"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA" style="font-family:"Arial","sans-serif";color:#1F497D">>
</span><span lang="EN-CA" style="font-family:"Arial","sans-serif"">Anand Neeli</span><span lang="EN-CA"><o:p></o:p></span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">   One key change I made to my sample applications is to remove the “#define TRACEPOINT_DEFINE” that precedes the “#include "tp.h"” line.  I prefer
 to control that #define using a compiler -D option.  It makes the makefile clearer and resolves the problem of making sure there is just one module that turns that #define on.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">  
</span><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Hope this helps.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal">Daniel U. Thibault<br>
Protection des systèmes et contremesures (PSC) | Systems Protection & Countermeasures (SPC)<br>
Cyber sécurité pour les missions essentielles (CME) | Mission Critical Cyber Security (MCCS)<br>
R & D pour la défense Canada - Valcartier (RDDC Valcartier) | Defence R&D Canada - Valcartier (DRDC Valcartier)<br>
2459 route de la Bravoure<br>
Québec QC  G3J 1X5<br>
CANADA<br>
Vox : (418) 844-4000 x4245<br>
Fax : (418) 844-4538<br>
NAC : 918V QSDJ <<a href="--ESFSECEV-TY3011--------------------------------" target="_blank">http://www.travelgis.com/map.asp?addr=918V%20QSDJ</a>><br>
Gouvernement du Canada | Government of Canada<br>
<<a href="--ESFSECEV-TY3011---------------------" target="_blank">http://www.valcartier.drdc-rddc.gc.ca/</a>><span style="color:#1F497D"><o:p></o:p></span></p>
</div>
</div>
</div>
</body>
</html>