Hi guys,

I am using liblttng-ust-libc-wrapper to detect memory leaks in my
applications.
In order to identify not only the thread where the unfreed allocations are
done, but also the calling function, I extended the
liblttng-ust-libc-wrapper to log the "return
address" (__builtin_return_address(0)) in addition to the parameters of
malloc(). It solves my problem and does not affect Trace Compass.
Was this the right thing to do ?
If it is, then I guess that it might interest other people too.

diff -Nurd b/liblttng-ust-libc-wrapper/lttng-ust-malloc.c
c/liblttng-ust-libc-wrapper/lttng-ust-malloc.c
--- b/liblttng-ust-libc-wrapper/lttng-ust-malloc.c    2015-01-06
17:14:34.000000000 +0100
+++ c/liblttng-ust-libc-wrapper/lttng-ust-malloc.c    2015-01-06
17:16:40.811145106 +0100
@@ -260,7 +260,7 @@
      }
      retval = cur_alloc.malloc(size);
      if (URCU_TLS(malloc_nesting) == 1) {
-           tracepoint(ust_libc, malloc, size, retval);
+           tracepoint(ust_libc, malloc, size, retval,
__builtin_return_address(0) );
      }
      URCU_TLS(malloc_nesting)--;
      return retval;
@@ -279,7 +279,7 @@
      }

      if (URCU_TLS(malloc_nesting) == 1) {
-           tracepoint(ust_libc, free, ptr);
+           tracepoint(ust_libc, free, ptr, __builtin_return_address(0) );
      }

      if (cur_alloc.free == NULL) {
@@ -308,7 +308,7 @@
      }
      retval = cur_alloc.calloc(nmemb, size);
      if (URCU_TLS(malloc_nesting) == 1) {
-           tracepoint(ust_libc, calloc, nmemb, size, retval);
+           tracepoint(ust_libc, calloc, nmemb, size, retval,
__builtin_return_address(0) );
      }
      URCU_TLS(malloc_nesting)--;
      return retval;
@@ -360,7 +360,7 @@
      retval = cur_alloc.realloc(ptr, size);
 end:
      if (URCU_TLS(malloc_nesting) == 1) {
-           tracepoint(ust_libc, realloc, ptr, size, retval);
+           tracepoint(ust_libc, realloc, ptr, size, retval,
__builtin_return_address(0) );
      }
      URCU_TLS(malloc_nesting)--;
      return retval;
@@ -380,7 +380,7 @@
      }
      retval = cur_alloc.memalign(alignment, size);
      if (URCU_TLS(malloc_nesting) == 1) {
-           tracepoint(ust_libc, memalign, alignment, size, retval);
+           tracepoint(ust_libc, memalign, alignment, size, retval,
__builtin_return_address(0) );
      }
      URCU_TLS(malloc_nesting)--;
      return retval;
@@ -401,7 +401,7 @@
      retval = cur_alloc.posix_memalign(memptr, alignment, size);
      if (URCU_TLS(malloc_nesting) == 1) {
            tracepoint(ust_libc, posix_memalign, *memptr, alignment, size,
-                 retval);
+                 retval, __builtin_return_address(0) );
      }
      URCU_TLS(malloc_nesting)--;
      return retval;
diff -Nurd b/liblttng-ust-libc-wrapper/ust_libc.h
c/liblttng-ust-libc-wrapper/ust_libc.h
--- b/liblttng-ust-libc-wrapper/ust_libc.h      2015-01-06
17:14:34.000000000 +0100
+++ c/liblttng-ust-libc-wrapper/ust_libc.h      2015-01-06
17:16:40.811145106 +0100
@@ -33,54 +33,60 @@
 #include <lttng/tracepoint.h>

 TRACEPOINT_EVENT(ust_libc, malloc,
-     TP_ARGS(size_t, size, void *, ptr),
+     TP_ARGS(size_t, size, void *, ptr, void *, ra),
      TP_FIELDS(
            ctf_integer(size_t, size, size)
            ctf_integer_hex(void *, ptr, ptr)
+           ctf_integer_hex(void *, ra, ra)
      )
 )

 TRACEPOINT_EVENT(ust_libc, free,
-     TP_ARGS(void *, ptr),
+     TP_ARGS(void *, ptr, void *, ra),
      TP_FIELDS(
            ctf_integer_hex(void *, ptr, ptr)
+           ctf_integer_hex(void *, ra, ra)
      )
 )

 TRACEPOINT_EVENT(ust_libc, calloc,
-     TP_ARGS(size_t, nmemb, size_t, size, void *, ptr),
+     TP_ARGS(size_t, nmemb, size_t, size, void *, ptr, void *, ra),
      TP_FIELDS(
            ctf_integer(size_t, nmemb, nmemb)
            ctf_integer(size_t, size, size)
            ctf_integer_hex(void *, ptr, ptr)
+           ctf_integer_hex(void *, ra, ra)
      )
 )

 TRACEPOINT_EVENT(ust_libc, realloc,
-     TP_ARGS(void *, in_ptr, size_t, size, void *, ptr),
+     TP_ARGS(void *, in_ptr, size_t, size, void *, ptr, void *, ra),
      TP_FIELDS(
            ctf_integer_hex(void *, in_ptr, in_ptr)
            ctf_integer(size_t, size, size)
            ctf_integer_hex(void *, ptr, ptr)
+           ctf_integer_hex(void *, ra, ra)
      )
 )

 TRACEPOINT_EVENT(ust_libc, memalign,
-     TP_ARGS(size_t, alignment, size_t, size, void *, ptr),
+     TP_ARGS(size_t, alignment, size_t, size, void *, ptr, void *, ra),
      TP_FIELDS(
            ctf_integer(size_t, alignment, alignment)
            ctf_integer(size_t, size, size)
            ctf_integer_hex(void *, ptr, ptr)
+           ctf_integer_hex(void *, ra, ra)
      )
 )

 TRACEPOINT_EVENT(ust_libc, posix_memalign,
-     TP_ARGS(void *, out_ptr, size_t, alignment, size_t, size, int,
result),
+     TP_ARGS(void *, out_ptr, size_t, alignment, size_t, size, int,
result, void *, ra),
      TP_FIELDS(
            ctf_integer_hex(void *, out_ptr, out_ptr)
            ctf_integer(size_t, alignment, alignment)
            ctf_integer(size_t, size, size)
            ctf_integer(int, result, result)
+           ctf_integer_hex(void *, ra, ra)
      )
 )

Best regards,
                                                                                
                                  
                                                                                
                                  
                                                                                
                                  
               Olivier Delbeke Senior Software Engineer                         
                                  
               [email protected] / T. +32 2 389 25 53 AWTC Europe S.A. - 
Avenue de l’Industrie, 19 - 1420  
               Braine-l’Alleud - Belgium - www.aweurope.eu - www.aisin-aw.co.jp 
                                  
               VAT : BE 0474.474.114 - RPM Nivelles                             
                                  
                                                                                
                                  
This mail, and any attachments thereto, is intended only for use by the 
addressee(s) named herein and may contain legally privileged and/or 
confidential information. If you are not the intended recipient, please note 
that any review, dissemination, disclosure, alteration, printing, copying or 
transmission of this mail and/or any file transmitted with it, is strictly 
prohibited and may be unlawful. If you have received this mail by mistake, 
please immediately notify the sender as well as our mail administrator at 
[email protected], and permanently destroy the original as well as any 
copy thereof.  
_______________________________________________
lttng-dev mailing list
[email protected]
http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev

Reply via email to