From: "Olivier Delbeke" <Olivier.Delbeke@awtce.be>
To: lttng-dev@lists.lttng.org
Sent: Tuesday, January 13, 2015 10:50:38 AM
Subject: [lttng-dev] Addition of the return address to        liblttng-ust-libc-wrapper

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 ?


You should be able to achieve the same thing with the "ip" context, e.g.:

lttng create
lttng enable-event -u -a
lttng add-context -u -t ip
lttng start
....

All this dynamically without changing the instrumentation.

Thanks,

Mathieu

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
Olivier.Delbeke@awtce.be / 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 postmaster@aweurope.be, and permanently destroy the original as well as any copy thereof.


_______________________________________________
lttng-dev mailing list
lttng-dev@lists.lttng.org
http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev



--
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com