Сначала я искал существующие ответы и видел, что Valgrind - это любимый инструмент для отладки утечки памяти на Linux. К сожалению, Valgrind, похоже, не работает для моих целей. Я попытаюсь объяснить, почему.
Ограничения:
- Утечка воспроизводится только в среде клиентов. Из-за определенных правовых ограничений мы должны работать с существующими двоичными. Нет перестроек.
- В обычной среде наше приложение потребляет ~ 10% CPU. Скажем, мы можем допустим увеличение производительности до 10 раз. Valgrind с memcheck по умолчанию настройки делают намного хуже, делая наше приложение безответным надолго периоды времени.
Что мне нужно, это эквивалент Microsoft UMDH: включить трассировку стека для каждого распределения кучи, а затем в определенный момент времени выгрузить все распределения, сгруппированные по стекам и упорядоченные по счету подсчета в порядке убывания. Наше приложение поставляется на платформах Windows и Linux, поэтому я знаю, что производительность в Windows под UMDH по-прежнему переносима.
Вот инструменты/методы, которые я рассматривал
- Инструменты Valgrind -memcheck и -massif Они выполняют гораздо больше, чем необходимо (например, сканирование всей памяти процесса для каждого распределения указатель), они слишком медленны, и они до сих пор не делают точно, что я нужно (сбрасывать вызовы с дампами по счетам), поэтому мне придется писать некоторые скрипты, анализирующие выходные данные
- Библиотека dmalloc (dmalloc.com) требует нового двоичного файла
- LeakTracer (http://www.andreasen.org/LeakTracer/) Работает только с С++ new/delete (мне также нужен malloc/free), не имеет группового стека и функции сортировки
- Реализация инструмента как библиотеки .so с использованием LD_PRELOAD механизм (Переопределение "malloc" с использованием механизма LD_PRELOAD) Это займет не менее недели, учитывая мои навыки кодирования для Linux, и это чувствует как изобретать велосипед.
Я что-то пропустил? Есть ли облегченные варианты Valgrind или существующий инструмент LD_PRELOAD?