Я столкнулся с проблемой утечки памяти в приложении (приложение содержит 12 файлов .c, а каждый файл .c содержит примерно от 4000 до 7000 строк кода), поэтому одно из решений — отладить приложение с помощью «valgrind» и выяснить проблему утечки памяти, но мне было интересно другое решение, чем инструмент «valgrind». Поскольку я хотел решить проблему с утечкой памяти
другим способом, я начал исследовать эту область.

Я использовал команду «top» в Linux и знаю, что она дает полный снимок системы в заданный интервал времени. Поэтому я начал искать параметр, который дает мне физическую (реальную) память, используемую процессом/приложением, и узнал о размере резидентного набора (из википедии, «Размер резидентного набора — это часть память процесса, которая хранится в ОЗУ»). Теперь все, что мне нужно написать, и приложение, которое печатает значение «RSS».

Теперь это рождает Memwatch (https://github.com/skanzariya/Memwatch). Memwatch выводит общий объем памяти и фактическое использование физической памяти процессом с определенным интервалом.

Итак, чтобы отследить утечку памяти в приложении, я запускаю приложение с помощью gdb и устанавливаю точку останова на «основном», и я запускаю выполнение функции за функцией, переходя к функции, я постоянно отслеживаю вывод «Memwatch» и в один момент момент, когда я обнаружил, что память значительно увеличилась, поэтому я отлаживаю эту функцию и обнаружил, что в функции была огромная утечка памяти (из-за использования strdup и malloc без свободной реализации).

Короче говоря, это еще одна короткая реализация команды «top», но вы можете использовать функцию «CheckUsage» в своем приложении и вызывать ее до и после функции, и она будет печатать использование памяти в начале и в конце функции, но это лениво и еще один способ узнать. Другое решение состоит в том, чтобы добиться того же самого с помощью комбинации «top», «awk» и других команд Linux.

Значение «Resident Set Size» помогло мне обнаружить утечку памяти, и я написал небольшое приложение поверх этого, и я решил поделиться им со всем миром.

Если вам понравился этот пост, напишите мне в Твиттере по адресу @suresh_kanzaria.

Удачного взлома!

-Суреш