<p>I'm not sure I understand the goal of this feature. Can you explain more? </p>
<div class="gmail_quote">On Sep 11, 2012 4:56 PM, "Christian Babeux" <<a href="mailto:christian.babeux@efficios.com">christian.babeux@efficios.com</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi,<br>
<br>
This is a RFC for a testpoint mechanism to ease and improve testing<br>
efforts of the LTTng codebase.<br>
<br>
Motivation<br>
----------<br>
<br>
The main goal behind the testpoint mechanism is to be able to test and<br>
validate failure cases in different portion of the LTTng codebase. It<br>
could also be used by developers as a debugging aid.<br>
<br>
By injecting code at runtime in the lttng daemons/processes/executables,<br>
we can painlessly trigger faulty behavior, test errors paths or even<br>
reproduce race conditions by introducing or exacerbating delays between<br>
threads.<br>
<br>
Requirements<br>
------------<br>
<br>
The testpoint mechanism should be able to be triggered via scripts to<br>
automate testing efforts.<br>
<br>
Ideally, the testpoint mechanism should *NOT* incur a significant<br>
performance hit if we want to leave it always on, in a similar fashion<br>
to the assert() macros.<br>
<br>
By leaving it always on, any user is able to use our tests and validate<br>
the behavior of his installation via a simple 'make check' execution.<br>
<br>
Proposed solution<br>
-----------------<br>
<br>
This patch introduce two new macros: TESTPOINT_DECL(name)<br>
and testpoint(name).<br>
<br>
Here a quick example that shows how to use the testpoint mechanism:<br>
<br>
file: main.c<br>
#include <stdio.h><br>
#include <common/testpoint/testpoint/testpoint.h><br>
<br>
/* Testpoint declaration */<br>
TESTPOINT_DECL(interesting_function)<br>
<br>
void interesting_function(void)<br>
{<br>
        testpoint(interesting_function);<br>
        /* Some processing that can fail */<br>
        ...<br>
}<br>
<br>
int main(int argc, char *argv[])<br>
{<br>
        interesting_function();<br>
        ...<br>
        printf("End");<br>
}<br>
<br>
file: testpoint.c<br>
#include <stdio.h><br>
void __testpoint_interesting_function(void)<br>
{<br>
        printf("In testpoint of interesting function!");<br>
}<br>
<br>
Compile:<br>
gcc -o test main.c<br>
gcc -fPIC -shared -o testpoint.so testpoint.c<br>
<br>
Run:<br>
> ./test<br>
  End<br>
> export LTTNG_TESTPOINT_ENABLE=1<br>
> LD_PRELOAD=testpoint.so ./test<br>
  In testpoint of interesting function!<br>
  End<br>
> export LTTNG_TESTPOINT_ENABLE=0<br>
> LD_PRELOAD=testpoint.so ./test<br>
  End<br>
<br>
The testpoint mechanism is triggered via the preloading of a shared<br>
object containing the appropriate testpoint symbols and by setting the<br>
LTTNG_TESTPOINT_ENABLE environment variable.<br>
<br>
The check on this environment variable is done on the application startup<br>
with the help of a constructor (lttng_testpoint_check) which toggle a global<br>
state variable indicating whether or not the testpoints should be activated.<br>
<br>
When enabled, the testpoint() macro calls an underlying wrapper specific to<br>
the testpoint and simply try to lookup the testpoint symbol via a dlsym()<br>
call.<br>
<br>
When disabled, the testpoint() call will only incur an additionnal test<br>
per testpoint on a global variable. This performance 'hit' should be<br>
acceptable for production use.<br>
<br>
As stated previously, the testpoint mechanism should be *always on*.<br>
It can be explicitly disabled via CFLAGS="-DNTESTPOINT" in a way similar<br>
to NDEBUG and assert().<br>
<br>
Comments, thoughts?<br>
<br>
Thanks,<br>
<br>
Christian Babeux (1):<br>
  New testpoint mechanism to instrument LTTng binaries for testing<br>
    purpose<br>
<br>
 <a href="http://configure.ac" target="_blank">configure.ac</a>                     |  1 +<br>
 src/common/Makefile.am           |  2 +-<br>
 src/common/testpoint/Makefile.am |  6 +++<br>
 src/common/testpoint/testpoint.c | 43 +++++++++++++++++++++<br>
 src/common/testpoint/testpoint.h | 81 ++++++++++++++++++++++++++++++++++++++++<br>
 5 files changed, 132 insertions(+), 1 deletion(-)<br>
 create mode 100644 src/common/testpoint/Makefile.am<br>
 create mode 100644 src/common/testpoint/testpoint.c<br>
 create mode 100644 src/common/testpoint/testpoint.h<br>
<br>
--<br>
1.7.11.4<br>
<br>
<br>
_______________________________________________<br>
lttng-dev mailing list<br>
<a href="mailto:lttng-dev@lists.lttng.org">lttng-dev@lists.lttng.org</a><br>
<a href="http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev" target="_blank">http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev</a><br>
</blockquote></div>