Rename liblttng-ust-malloc to liblttng-ust-libc, update to lttng-ust 2.0
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Tue, 13 Dec 2011 04:47:24 +0000 (23:47 -0500)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Tue, 13 Dec 2011 04:47:24 +0000 (23:47 -0500)
- includes a fix to tracepoints to disable the tracepoint sites upon
  unregistration of the library. This is useful for cases where, like
  the libc wrapper, the library dependency for constructor/destructor
  is not quite right due to cross-dependencies (lttng-ust depends on
  malloc/free). This ensures the session teardown will never be in a
  position where it could teardown data structures still in use
  by probes that cannot be unregistered because their associated
  library would already have called its destructor.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
13 files changed:
Makefile.am
README
configure.ac
liblttng-ust-libc/Makefile.am [new file with mode: 0644]
liblttng-ust-libc/README [new file with mode: 0644]
liblttng-ust-libc/lttng-ust-malloc.c [new file with mode: 0644]
liblttng-ust-libc/run [new file with mode: 0755]
liblttng-ust-libc/ust_libc.h [new file with mode: 0644]
liblttng-ust-malloc/Makefile.am [deleted file]
liblttng-ust-malloc/README [deleted file]
liblttng-ust-malloc/mallocwrap.c [deleted file]
liblttng-ust-malloc/run [deleted file]
liblttng-ust/tracepoint.c

index d7d50791415869e541f2699a029f4f8936ac6d74..01acea43e93ec854edf38f502fd59259be354def 100644 (file)
@@ -4,6 +4,7 @@ SUBDIRS = . include snprintf libringbuffer liblttng-ust-comm \
                liblttng-ust \
                liblttng-ust-ctl \
                liblttng-ust-fork \
+               liblttng-ust-libc \
                tests
 
 if BUILD_JNI_INTERFACE
diff --git a/README b/README
index 114e3b25fd347176a9322ba2575a42c2c7a0654d..71d7188460a5ab159f65e6a5b4f50ec5c55135d0 100644 (file)
--- a/README
+++ b/README
@@ -117,9 +117,10 @@ PACKAGE CONTENTS:
   - tests
     Various test programs
 
-  - liblttng-ust-malloc
-    An example library that can be LD_PRELOAD'ed to instrument calls to malloc()
-    in any program without need to recompile it.
+  - liblttng-ust-libc
+    An example library that can be LD_PRELOAD'ed to instrument some
+    calls to libc (currently malloc() and free()) in any program without
+    need to recompile it.
 
   - liblttng-ust-fork
     A library that is LD_PRELOAD'ed, and that hijacks calls to several system
index 56cc5e46feb79d113bb4ac7353b2967c5fa667b5..e1542082405ade0732992314ed1249dc21488482 100644 (file)
@@ -202,7 +202,6 @@ Use the --with-java-jdk=DIR flag to point to your Java include files, or disable
 AM_CONDITIONAL([BUILD_JNI_INTERFACE], [test "x$jni_interface" = "xyes"])
 
 #currently disabled.
-       #liblttng-ust-malloc/Makefile
        #tests/hello2/Makefile
        #tests/basic/Makefile
        #tests/simple_include/Makefile
@@ -230,6 +229,7 @@ AC_CONFIG_FILES([
        liblttng-ust-ctl/Makefile
        liblttng-ust-fork/Makefile
        liblttng-ust-java/Makefile
+       liblttng-ust-libc/Makefile
        tests/Makefile
        tests/hello/Makefile
        tests/hello.cxx/Makefile
diff --git a/liblttng-ust-libc/Makefile.am b/liblttng-ust-libc/Makefile.am
new file mode 100644 (file)
index 0000000..15ef157
--- /dev/null
@@ -0,0 +1,9 @@
+AM_CPPFLAGS = -I$(top_srcdir)/include
+AM_CFLAGS = -fno-strict-aliasing
+
+lib_LTLIBRARIES = liblttng-ust-libc.la
+liblttng_ust_libc_la_SOURCES = lttng-ust-malloc.c
+liblttng_ust_libc_la_LIBADD = -ldl
+
+noinst_SCRIPTS = run
+EXTRA_DIST = run
diff --git a/liblttng-ust-libc/README b/liblttng-ust-libc/README
new file mode 100644 (file)
index 0000000..09e17cb
--- /dev/null
@@ -0,0 +1,9 @@
+liblttng-ust-libc is used for instrumenting some calls to libc in a
+program, without need for recompiling it.
+
+This library defines a malloc() function that is instrumented with a
+tracepoint. It also calls the libc malloc afterwards. When loaded with
+LD_PRELOAD, it replaces the libc malloc() function, in effect
+instrumenting all calls to malloc(). The same is performed for free().
+
+See the "run" script for a usage example.
diff --git a/liblttng-ust-libc/lttng-ust-malloc.c b/liblttng-ust-libc/lttng-ust-malloc.c
new file mode 100644 (file)
index 0000000..3212ff0
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2009  Pierre-Marc Fournier
+ * Copyright (C) 2011  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
+ */
+
+#define _GNU_SOURCE
+#include <dlfcn.h>
+#include <sys/types.h>
+#include <stdio.h>
+
+#define TRACEPOINT_DEFINE
+#define TRACEPOINT_CREATE_PROBES
+#include "ust_libc.h"
+
+void *malloc(size_t size)
+{
+       static void *(*plibc_malloc)(size_t size) = NULL;
+       void *retval;
+
+       if (plibc_malloc == NULL) {
+               plibc_malloc = dlsym(RTLD_NEXT, "malloc");
+               if (plibc_malloc == NULL) {
+                       fprintf(stderr, "mallocwrap: unable to find malloc\n");
+                       return NULL;
+               }
+       }
+       retval = plibc_malloc(size);
+       tracepoint(ust_libc, malloc, size, retval);
+       return retval;
+}
+
+void free(void *ptr)
+{
+       static void *(*plibc_free)(void *ptr) = NULL;
+
+       if (plibc_free == NULL) {
+               plibc_free = dlsym(RTLD_NEXT, "free");
+               if (plibc_free == NULL) {
+                       fprintf(stderr, "mallocwrap: unable to find free\n");
+                       return;
+               }
+       }
+       tracepoint(ust_libc, free, ptr);
+       plibc_free(ptr);
+}
diff --git a/liblttng-ust-libc/run b/liblttng-ust-libc/run
new file mode 100755 (executable)
index 0000000..e902cd8
--- /dev/null
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+LD_VERBOSE=1 LD_PRELOAD=.libs/liblttng-ust-libc.so $1
diff --git a/liblttng-ust-libc/ust_libc.h b/liblttng-ust-libc/ust_libc.h
new file mode 100644 (file)
index 0000000..b40548f
--- /dev/null
@@ -0,0 +1,51 @@
+#undef TRACEPOINT_PROVIDER
+#define TRACEPOINT_PROVIDER ust_libc
+
+#if !defined(_TRACEPOINT_UST_LIBC_H) || defined(TRACEPOINT_HEADER_MULTI_READ)
+#define _TRACEPOINT_UST_LIBC_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Copyright (C) 2011  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose,  provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#include <lttng/tracepoint.h>
+
+TRACEPOINT_EVENT(ust_libc, malloc,
+       TP_ARGS(size_t, size, void *, ptr),
+       TP_FIELDS(
+               ctf_integer(size_t, size, size)
+               ctf_integer_hex(unsigned long, ptr, (unsigned long) ptr)
+       )
+)
+
+TRACEPOINT_EVENT(ust_libc, free,
+       TP_ARGS(void *, ptr),
+       TP_FIELDS(
+               ctf_integer_hex(unsigned long, ptr, (unsigned long) ptr)
+       )
+)
+
+#endif /* _TRACEPOINT_UST_LIBC_H */
+
+#undef TRACEPOINT_INCLUDE_FILE
+#define TRACEPOINT_INCLUDE_FILE ./ust_libc.h
+
+/* This part must be outside ifdef protection */
+#include <lttng/tracepoint-event.h>
+
+#ifdef __cplusplus 
+}
+#endif
diff --git a/liblttng-ust-malloc/Makefile.am b/liblttng-ust-malloc/Makefile.am
deleted file mode 100644 (file)
index eb2ea75..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-AM_CPPFLAGS = -I$(top_srcdir)/include
-AM_CFLAGS = -fno-strict-aliasing
-
-lib_LTLIBRARIES = liblttng-ust-malloc.la
-liblttng_ust_malloc_la_SOURCES = mallocwrap.c
-liblttng_ust_malloc_la_LIBADD = -ldl
-
-noinst_SCRIPTS = run
-EXTRA_DIST = run
diff --git a/liblttng-ust-malloc/README b/liblttng-ust-malloc/README
deleted file mode 100644 (file)
index c58a7e6..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-libustinstr-malloc is used for instrumenting calls to malloc(3) in a program,
-without need for recompiling it.
-
-libustinstr-malloc defines a malloc() function that is instrumented with a
-marker. It also calls the libc malloc afterwards. When loaded with LD_PRELOAD,
-it replaces the libc malloc() function, in effect instrumenting all calls to
-malloc().
-
-See the "run" script for a usage example.
diff --git a/liblttng-ust-malloc/mallocwrap.c b/liblttng-ust-malloc/mallocwrap.c
deleted file mode 100644 (file)
index 6e66856..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2009  Pierre-Marc Fournier
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
- */
-
-#define _GNU_SOURCE
-#include <dlfcn.h>
-#include <sys/types.h>
-#include <stdio.h>
-#include <ust/marker.h>
-
-void *malloc(size_t size)
-{
-       static void *(*plibc_malloc)(size_t size) = NULL;
-       void *retval;
-
-       if (plibc_malloc == NULL) {
-               plibc_malloc = dlsym(RTLD_NEXT, "malloc");
-               if (plibc_malloc == NULL) {
-                       fprintf(stderr, "mallocwrap: unable to find malloc\n");
-                       return NULL;
-               }
-       }
-
-       retval = plibc_malloc(size);
-
-       ust_marker(malloc, "size %d ptr %p", (int)size, retval);
-
-       return retval;
-}
-
-void free(void *ptr)
-{
-       static void *(*plibc_free)(void *ptr) = NULL;
-
-       if (plibc_free == NULL) {
-               plibc_free = dlsym(RTLD_NEXT, "free");
-               if (plibc_free == NULL) {
-                       fprintf(stderr, "mallocwrap: unable to find free\n");
-                       return;
-               }
-       }
-
-       ust_marker(free, "ptr %p", ptr);
-
-       plibc_free(ptr);
-}
-
-UST_MARKER_LIB
diff --git a/liblttng-ust-malloc/run b/liblttng-ust-malloc/run
deleted file mode 100644 (file)
index ce4fd10..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-
-LD_VERBOSE=1 LD_LIBRARY_PATH=.:../libust/.libs:../../liburcu LD_PRELOAD=liburcu.so:libust.so:.libs/libmallocwrap.so $1
index f146d382b7717955875938a1169d8436515ee043..a71e3e6e3967ea59bee850fe717fadad08b1669a 100644 (file)
@@ -524,6 +524,20 @@ static void new_tracepoints(struct tracepoint * const *start, struct tracepoint
        }
 }
 
+static
+void lib_disable_tracepoints(struct tracepoint * const *begin,
+                       struct tracepoint * const *end)
+{
+       struct tracepoint * const *iter;
+
+       for (iter = begin; iter < end; iter++) {
+               if (!*iter)
+                       continue;       /* skip dummy */
+               disable_tracepoint(*iter);
+       }
+
+}
+
 int tracepoint_register_lib(struct tracepoint * const *tracepoints_start,
                            int tracepoints_count)
 {
@@ -566,18 +580,34 @@ lib_added:
 int tracepoint_unregister_lib(struct tracepoint * const *tracepoints_start)
 {
        struct tracepoint_lib *lib;
+       int tracepoints_count;
 
        ust_lock();
        cds_list_for_each_entry(lib, &libs, list) {
                if (lib->tracepoints_start == tracepoints_start) {
                        struct tracepoint_lib *lib2free = lib;
+
                        cds_list_del(&lib->list);
+                       tracepoints_count = lib->tracepoints_count;
                        free(lib2free);
-                       break;
+                       goto found;
                }
        }
+       goto end;
+found:
+       /*
+        * Force tracepoint disarm for all tracepoints of this lib.
+        * This takes care of destructor of library that would leave a
+        * LD_PRELOAD wrapper override function enabled for tracing, but
+        * the session teardown would not be able to reach the
+        * tracepoint anymore to disable it.
+        */
+       lib_disable_tracepoints(tracepoints_start,
+                       tracepoints_start + tracepoints_count);
+       DBG("just unregistered a tracepoints section from %p",
+               tracepoints_start);
+end:
        ust_unlock();
-
        return 0;
 }
 
This page took 0.031303 seconds and 4 git commands to generate.