public inbox for crossgcc@sourceware.org
 help / color / mirror / Atom feed
From: Eric Doenges <doenges@mvtec.com>
To: crossgcc@sourceware.org
Subject: Re: How can I modify the source of new,malloc
Date: Wed, 27 Jun 2012 09:17:00 -0000	[thread overview]
Message-ID: <4FEACF83.7010904@mvtec.com> (raw)
In-Reply-To: <201206262214.37680.yann.morin.1998@free.fr>

On 26.06.2012 22:14, Yann E. MORIN wrote:

> As Mirko suggested, I'd use a loader trick to pre-load a shared lib that
> overrides the malloc() and free() functions. Something like (untested!):
> 
> void* malloc( size_t size )
> {
>     static void* real_malloc;
> 
>     if( ! real_malloc ) {
>         real_malloc = dlsym( RTLD_NEXT, "malloc" );
>         if( ! real_malloc ) {
>             panic_and_exit();
>         }
>     }
>     fprintf( stderr, "Allocating %d bytes\n", size );
>     return real_malloc( size );
> }
> 
> Then, replacing printf with calls to backtrace(3) and backtrace_symbols_fd(3),
> you can know the caller (function, offset), if you have the debug symbols in
> the binaries (libs and executable), in which case you can post-process that
> to find the actual  file, function and line at which the call to malloc is
> made.
> 
> (Note: do not use backtrace_symbols(3), as it calls malloc! So you have
> to use backtrace_symbols_fd(3)).
> 
> Then, you can write such wrappers to free(3) and so on...

Also note that if you wrap calloc() like malloc() above, you will run
into the problem that dlsym calls calloc (at least on all the Linux
systems I have tested on). What I do is to load the pointers to the real
functions in a special initialization function that is marked with the
"constructor" attribute, and call sbrk() instead of the real calloc if
the pointer to the real calloc hasn't been defined yet.

> Note however, that if you can recompile your application, you may want to
> link with a library like DUMA or dmalloc instead of using the above trick.
>   http://duma.sourceforge.net/
>   http://dmalloc.com/

If you really want to go down the wrapper route, I can send you my
wrapper off-list as a starting point. It currently prints out how much
memory was requested (and tracks all allocations, so it can tell you
about possible memory leaks on exit), but since I didn't know about
backtrace(3) and friends it doesn't show you where the call came from (yet).
-- 
Dr. Eric Dönges                            doenges@mvtec.com
MVTec Software GmbH | Neherstr. 1 | 81675 München  | Germany
www.mvtec.com | Tel: +49 89 457695-0 | Fax: +49 89 457695-55
Geschäftsführer: Dr. Wolfgang Eckstein, Dr. Olaf Munkelt
Amtsgericht München HRB 114695



--
For unsubscribe information see http://sourceware.org/lists.html#faq

  parent reply	other threads:[~2012-06-27  9:17 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-06-25 21:55 Zvi Vered
2012-06-25 22:28 ` Mirko Banchi
2012-06-26 20:14   ` Yann E. MORIN
2012-06-26 20:21     ` Joel Sherrill
2012-06-27  9:17     ` Eric Doenges [this message]
2012-06-27  9:51       ` Eric Doenges
2012-06-27 20:05         ` Yann E. MORIN

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4FEACF83.7010904@mvtec.com \
    --to=doenges@mvtec.com \
    --cc=crossgcc@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).