Monday, 26 August 2013

Lightweight memory leak debugging on linux

Lightweight memory leak debugging on linux

I looked for existing answers first and saw that Valgrind is everyone's
favorite tool for memory leak debugging on linux. Unfortunately Valgrind
does not seem to work for my purposes. I will try to explain why.
Constraints:
The leak reproduces only in customer's environment. Due to certain legal
restrictions we have to work with existing binary. No rebuilds.
In regular environment our application consumes ~10% CPU. Say, we can
tolerate up to 10x CPU usage increase. Valgrind with default memcheck
settings does much worse making our application unresponsive for long
periods of time.
What I need is an equivalent of Microsoft's UMDH: turn on stack tracing
for each heap allocation, then at certain point of time dump all
allocations grouped by stacks and ordered by allocation count in
descending order. Our app ships on both Windows and Linux platforms, so I
know that performance on Windows under UMDH is still tolerable.
Here are the tools/methods I considered
Valgrind's -memcheck and –massif tools They do much more than needed (like
scanning whole process memory for every allocation pointer), they are too
slow, and they still don't do exactly what I
need (dump callstacks sorted by counts), so I will have to write some
scripts parsing the output
dmalloc library (dmalloc.com) requires new binary
LeakTracer (http://www.andreasen.org/LeakTracer/) Works only with C++
new/delete (I need malloc/free as well), does not have group-by-stack and
sort functionality
Implementing the tool myself as .so library using LD_PRELOAD mechanism
(Overriding 'malloc' using the LD_PRELOAD mechanism) That will take at
least a week given my coding-for-Linux skills and it fills like inventing
a bicycle.
Did I miss anything? Are there any lightweight Valgrind options or
existing LD_PRELOAD tool?

No comments:

Post a Comment