Облегченная отладка утечки памяти на Linux
Сначала я искал существующие ответы и видел, что 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?
Ответы
Ответ 1
Удивительно, но я не смог найти что-то вроде Microsoft UMDH в домене с открытым исходным кодом или для немедленной загрузки. (Я также посмотрел Google Heap Leak Checker, но он скорее похож на Valgrind, а не на UMDH). Поэтому я в конечном итоге написал инструмент, используя проект malloc в качестве ориентира:
https://github.com/glagolig/heapwatch
У инструмента есть ряд ограничений, но он отлично подходит для моих целей.
Ответ 2
GNU libc имеет встроенную отладку malloc:
http://www.gnu.org/software/libc/manual/html_node/Allocation-Debugging.html
Используйте LD_PRELOAD для вызова mtrace()
из вашего собственного .so:
#include <mcheck.h>
static void prepare(void) __attribute__((constructor));
static void prepare(void)
{
mtrace();
}
Скомпилируйте его с помощью
gcc -shared -fPIC dbg.c -o dbg.so
Запустите его с помощью
export MALLOC_TRACE=out.txt
LD_PRELOAD=./dbg.so ./my-leaky-program
Позже проверьте выходной файл:
mtrace ./my-leaky-program out.txt
И вы получите что-то вроде:
Memory not freed:
-----------------
Address Size Caller
0x0000000001bda460 0x96 at /tmp/test/src/test.c:7
Конечно, не стесняйтесь писать собственные крючки malloc, которые выгружают весь стек (вызывая backtrace(), если вы думаете, что это поможет).
Номера строк и/или имена функций будут доступны, если вы сохранили информацию об отладке для двоичного файла где-то (например, двоичный файл имеет встроенную информацию об отладке, или вы сделали objcopy --only-keep-debug my-leaky-program my-leaky-program.debug
).
Кроме того, вы можете попробовать Boehm GC, он также работает как детектор утечки:
http://www.hpl.hp.com/personal/Hans_Boehm/gc/leak.html
Ответ 3
Я хотел бы рекламировать мою только что объявленную утилиту heaptrack, которая должна быть именно тем, кого вы ищете тогда. Вы можете найти более подробную информацию здесь: http://milianw.de/blog/heaptrack-a-heap-memory-profiler-for-linux
По сравнению с вашим инструментом heapwatch производительность должна быть намного лучше, поскольку я использую libunwind и позже libbacktrace, чтобы задержать аннотацию backtrace с информацией об отладке DWARF.
Мне бы хотелось получить больше отзывов об этом, поэтому попробуйте!
Ответ 4
MemoryScape удовлетворит ваши потребности. Это инструмент для отладки динамической памяти, который поставляется с отладчиком TotalView.
http://www.roguewave.com/products/memoryscape.aspx
Ответ 5
memleax должен работать на вас.
Отлаживает утечку памяти запущенного процесса, присоединяя его, не перекомпилируя программу или перезагружая целевой процесс. Это очень удобно и подходит для производственной среды.
Это TRAP только для вызовов malloc/free(), поэтому оно должно приводить к меньшему результату, чем Vagrild.
Он работает на GNU/Linux-x86_64 и FreeBSD-amd64.
ПРИМЕЧАНИЕ. Я автор, любое предложение приветствуется.
Ответ 6
@glagolig,
Да, MemoryScape может группировать распределения по местоположению стека.
Вы могли получить оценочную версию? Предполагая, что вы использовали адрес электронной почты, который не похож на бота, вы должны были услышать от нас довольно быстро. Если нет, или если у вас возникли технические проблемы, дайте мне крик или обратитесь в нашу службу технической поддержки.
Крис Готтбрат
Главный менеджер продуктов для TotalView в программном обеспечении Rogue Wave
email: Имя. Фамилия (at) roguewave. ком