Есть ли способ, я могу найти утечку памяти запущенного процесса? Я могу использовать Valgrind для обнаружения утечек памяти перед началом процесса. Я могу использовать GDB, чтобы прикрепить его к запущенному процессу. Как я могу отладить утечки памяти запущенного процесса?
c
gdb
memory-leaks
howtechstuffworks
источник
источник
Ответы:
Вот почти гарантированные шаги, чтобы найти, кто утечка памяти:
Узнайте PID процесса, который вызывает утечку памяти.
захватить
/proc/PID/smaps
и сохранить в какой-то файл, какBeforeMemInc.txt
./proc/PID/smaps
и сохранить егоafterMemInc.txt
найти разницу между первым
smaps
и вторымsmaps
, например, сdiff -u beforeMemInc.txt afterMemInc.txt
запишите диапазон адресов, в котором увеличилась память, например:
используйте GDB для выгрузки памяти на работающий процесс или получите coredump, используя
gcore -o process
Я использовал gdb при запуске процесса для выгрузки памяти в какой-то файл.
Теперь используйте
strings
команду илиhexdump -C
распечататьdump_outputfile.dump
Вы получаете читаемую форму, где вы можете найти эти строки в вашем исходном коде.
Проанализируйте свой источник, чтобы найти утечку.
источник
Я думаю, что memleax это именно то, что вы хотите.
Он отлаживает утечку памяти запущенного процесса, присоединяя его, без перекомпиляции программы или перезапуска целевого процесса. Это очень удобно и подходит для производственной среды.
Работает на GNU / Linux и FreeBSD.
ПРИМЕЧАНИЕ: я автор, любое предложение приветствуется
== РЕДАКТИРОВАТЬ ==
Я пишу еще один инструмент libleak , который перехватывает функции памяти по LD_PRELOAD.
Также нет необходимости изменять целевую программу. Несмотря на то, что вам нужно перезапустить процесс с LD_PRELOAD, вы можете включить / отключить обнаружение во время работы.
Там гораздо меньше влияния на производительность, так как нет ловушки сигнала.
По сравнению с аналогичными инструментами (такими как mtrace), он печатает полный стек вызовов в подозрительной точке утечки памяти.
источник
В Linux вы можете включить mtrace в своей программе, но это изменение кода.
В OpenBSD вы можете попробовать статистику malloc .
Также стоит взглянуть на программу проверки утечек Google , и в отличие от mtrace вы можете использовать ее,
LD_PRELOAD
чтобы избежать перекомпиляции.источник
Я думаю, что без поддержки мониторинга распределения после запуска программы непосредственно в исходном коде, вам не повезло. Вот две причины, которые я могу придумать:
Однако, если ваша программа выполняется внутри виртуальной машины, эта среда может обеспечить поддержку распределения ресурсов. Я знаю, что в Java есть несколько инструментов для выделения и мониторинга сборки мусора (например, visualVM ), которые подключаются к работающим программам или виртуальным машинам.
источник
Purify от IBM, вероятно, самый старый и самый сложный инструмент из всех. Он будет отмечать номер строки в коде, который вызывает утечку памяти.
источник