<div dir="ltr">Hi Daniel,<div>Thanks for your reply.</div><div>sorry for my ignorance but how are you generating <span style="font-family:arial,sans-serif;font-size:13px">libtp.so in your example?</span></div><div><span style="font-family:arial,sans-serif"><br>
</span></div><div><font face="arial, sans-serif">1) Also will this solution scale if my binary depends on lots of libraries which are instrumented?</font><br></div><div><span style="font-family:arial,sans-serif"><br></span></div>
<div><font face="arial, sans-serif">2) i'm fine with linking statically, can we avoid LD_PRELOAD? </font></div><div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">3) Is there any page which explains on why and how to use TRACEPOINT_PROVIDER, TRACEPOINT_CREATE_PROBES, TRACEPOINT_INCLUDE, </font><span style="font-family:arial,sans-serif;font-size:13px">TRACEPOINT_DEFINE, </span><span style="font-size:13px;font-family:arial,sans-serif">TRACEPOINT_PROBE_DYNAMIC_</span><span style="font-size:13px;font-family:arial,sans-serif">LINKAGE</span><span style="font-family:arial,sans-serif;font-size:13px"> </span></div>
<div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">my tp.h is, are there any errors in this?</font></div><div><font face="arial, sans-serif">#############</font></div>
<div><font face="arial, sans-serif"><div>#define TRACEPOINT_PROVIDER sample_component</div><div><br></div><div>#undef TRACEPOINT_INCLUDE</div><div>#define TRACEPOINT_INCLUDE "./tp.h"</div><div><br></div><div>#if !defined(_TP_H) || defined(TRACEPOINT_HEADER_MULTI_READ)</div>
<div>#define _TP_H</div><div><br></div><div>#include <lttng/tracepoint.h></div><div><br></div><div>TRACEPOINT_EVENT(</div><div>        sample_component,</div><div>        event,</div><div>        TP_ARGS(char *, text),</div>
<div>        TP_FIELDS(</div><div>                ctf_string(message, text)</div><div>        )</div><div>)</div><div>TRACEPOINT_LOGLEVEL(</div><div>        sample_component,</div><div>        event,</div><div>        TRACE_WARNING)</div>
<div><br></div><div>#endif /* _TP_H */</div><div>#include <lttng/tracepoint-event.h></div><div>#############</div></font></div><div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif"><br>
</font></div><div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">Thanks,</font></div><div><font face="arial, sans-serif">Anand Neeli</font></div></div><div class="gmail_extra"><br><br>
<div class="gmail_quote">On Thu, Apr 3, 2014 at 9:35 PM, Thibault, Daniel <span dir="ltr"><<a href="mailto:Daniel.Thibault@drdc-rddc.gc.ca" target="_blank">Daniel.Thibault@drdc-rddc.gc.ca</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
----------------------------------------------------------------------<br>
Date: Thu, 3 Apr 2014 16:55:38 +0530<br>
From: Anand Neeli <<a href="mailto:anand.neeli@gmail.com">anand.neeli@gmail.com</a>><br>
To: "<a href="mailto:lttng-dev@lists.lttng.org">lttng-dev@lists.lttng.org</a>" <<a href="mailto:lttng-dev@lists.lttng.org">lttng-dev@lists.lttng.org</a>><br>
<br>
> I have a library which is instrumented and tracepoints are added. And I<br>
> have 2 binary's (or daemons) which try to include this library. (one binary<br>
<div class="">> has instrumented code with tracepoints and other binary doesn't use<br>
> tracing)<br>
><br>
> I found that i need to instrument the daemon which includes the<br>
> instrumented library for the code to compile.<br>
><br>
</div>> Can't I have a daemon (without tracing functionality) which can include an<br>
<div class="">> instrumented library (i don't want to use tracing functionality in this<br>
> case)<br>
><br>
> I'm only able to build if both library and daemon which includes it are<br>
> instrumented.<br>
><br>
> Can anyone please give me more details on how to do this?<br>
> This is useful for huge code bases where you can selectively add tracing<br>
</div>> support to few libraries or daemons.<br>
><br>
> Anand Neeli<br>
<br>
   It can be done.  An uninstrumented app can rely on an instrumented shared object; whether the latter produces lttng events then depends on whether or not the tracepoint provider shared object is loaded when the app is invoked (using LD_PRELOAD).<br>

<br>
   Here is sample_neeli.c:<br>
#####<br>
#include <stdio.h> //For printf<br>
#include <unistd.h><br>
<br>
#include "cobject.h"<br>
int main(int argc, char **argv)<br>
{<br>
        int i = 0;<br>
        char themessage[20]; //Can hold up to "Hello World 9999999\0"<br>
<br>
        fprintf(stderr, "sample_neeli starting\n");<br>
        for (i = 0; i < 10000; i++) {<br>
                //We either prepare themessage in this module, or rely on an<br>
                //external shared object<br>
                cobject_message(themessage, i);<br>
                usleep(1);<br>
        }<br>
        fprintf(stderr, "sample_neeli done\n");<br>
        return 0;<br>
}<br>
#####<br>
cobject.c:<br>
#####<br>
#include <stdio.h> //For printf<br>
#include <unistd.h><br>
<br>
#include "tp.h"<br>
<br>
void cobject_message(char *themessage, int i)<br>
{<br>
        tracepoint(sample_component, event, "cobject_message");<br>
        sprintf(themessage, "CObject %u", i);<br>
}<br>
#####<br>
cobject.h:<br>
#####<br>
extern void cobject_message(char *themessage, int i);<br>
#####<br>
The tracepoint provider code should be easy to guess.<br>
<br>
The relevant Makefile fragments:<br>
#####<br>
CC = gcc<br>
LIBDL = -ldl # On Linux<br>
#LIBDL = -lc # On BSD<br>
LOCAL_CPPFLAGS += -I. $(AM_CPPFLAGS)<br>
LDFLAGS += -L/usr/local/lib $(AM_LDFLAGS)<br>
SOFLAGS = -fPIC<br>
TP_DEFINE = -D TRACEPOINT_DEFINE<br>
TP_DEFINE_DYNAMIC = $(TP_DEFINE) -D TRACEPOINT_PROBE_DYNAMIC_LINKAGE<br>
SOVERSION_MAJOR = 1<br>
SOVERSION_MINOR = 0<br>
<br>
libcobject.so: libcobject.o<br>
        @echo "~~~~~~Packaging $@:"<br>
        $(CC) -shared -Wl,-soname,$@.$(SOVERSION_MAJOR) -Wl,-no-as-needed \<br>
           -o $@.$(SOVERSION_MAJOR).$(SOVERSION_MINOR) $^<br>
        ln -sf $@.$(SOVERSION_MAJOR).$(SOVERSION_MINOR) $@.$(SOVERSION_MAJOR)<br>
        ln -sf $@.$(SOVERSION_MAJOR) $@<br>
<br>
libcobject.o: cobject.c cobject.h tp.h<br>
        @echo "~~~~~~Compiling $@:"<br>
        $(CC) $(CPPFLAGS) $(LOCAL_CPPFLAGS) $(SOFLAGS) $(TP_DEFINE_DYNAMIC) \<br>
           -c -o $@ $<<br>
<br>
neeli_dynamic_lib:: neeli_dynamic_lib.o<br>
        @echo "~~~~~~Linking sample_$@:"<br>
        $(CC) -Wl,-no-as-needed -o $@ -L. -lcobject $^ $(LDFLAGS) \<br>
           $(LIBDL) -Wl,-rpath,'$$ORIGIN',--enable-new-dtags<br>
        @echo "   Use '[LD_PRELOAD=./libtp.so] ./$@' to run $@"<br>
<br>
neeli_dynamic_lib.o: sample_neeli.c cobject.h<br>
        @echo "~~~~~~Compiling $@:"<br>
        $(CC) $(CPPFLAGS) $(LOCAL_CPPFLAGS) -c -o $@ $<<br>
#####<br>
<br>
   Running './neeli_dynamic_lib' yields no events.  Running 'LD_PRELOAD=./libtp.so ./neeli_dynamic_lib' yields the libcobject.so events.<br>
<br>
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="http://www.travelgis.com/map.asp?addr=918V%20QSDJ" target="_blank">http://www.travelgis.com/map.asp?addr=918V%20QSDJ</a>><br>
Gouvernement du Canada | Government of Canada<br>
<<a href="http://www.valcartier.drdc-rddc.gc.ca/" target="_blank">http://www.valcartier.drdc-rddc.gc.ca/</a>><br>
</blockquote></div><br></div>