memleax отлаживает и находит утечки памяти без перезагрузки сервиса или процесса и без перекомпилляции.
URL: https://github.com/WuBingzheng/memleax
как это работает
memleax ищет утечки памяти работающего процесса путем присоединения к нему. Он ловит в целевом процессе вызовы выделения памяти и освобождения и сообщает о блоках памяти, которые живут дольше заданного времени. По умолчанию, долгий период жизни считается более 10 секунд, однако этот параметр может быть изменен опцией -e
.
Это очень удобно использовать и подходит для рабочих серверов. Т.к нет необходимости в пересборке программы. Вы запускаете memleax присоединив его к целевому процессу, ждете и получаете отчет в реальном времени, потом убиваете memleax(Ctrl-C) и мониторинг прекращается.
memleax отслеживает новые потоки, НО не следит за отпочковавшимися процессами. Для слежения за всеми экземплярами процесса, необходимо для каждого из них запускай свой экземпляр memleax.
влияние на производительность
Т.к в целевом процессе, на каждое выделение и освобождение памяти срабатывает ловушка, то число выделений и освобождений влияют на производительность. Чем чаще идут отслеживаемые вызовы, тем медленнее выполняется целевой процесс.
сборка
Необходимы пакеты:
- libunwind
- libelf
- libdw или libdwarf. libdw предпочтительнее
Когда все библиотеки установлены - запустите:
./configure
make
sudo make install
Использование
Для отладки целевого процесса, запустите:
memleax [options] <target-pid>
отчеты будут выдаваться в режиме реального времени.
Подождите. Блоки памяти живущее дольше чем установлено -e
параметром, будут отображаться так:
CallStack[3]: memory expires with 101 bytes, backtrace:
0x00007fd322bd8220 libc-2.17.so malloc()+0
0x000000000040084e test foo()+14 foo.c:12
0x0000000000400875 test bar()+37 bar.c:20
0x0000000000400acb test main()+364 test.c:80
CallStack[3] is the ID of CallStack where memory leak happens.