2009-10-08 4 views
1

У меня есть программное обеспечение, работающее на Linux, которое пропускает память. Это встроенная система, поэтому у меня не так много инструментов для отладки, поэтому я использую printf.Как определить свободную память в программе, запущенной в Linux?

Короче говоря, что-то вроде «popen()», вызывающего вызов «cat/proc/meminfo» и сканирование для строки MemFree, есть способ, которым я могу поместить эту информацию в printf?

В настоящее время я делаю что-то похожее на:

# ./myprogram & 
# for ((c=0; c<99; c++)) do echo --- $c --- && cat /proc/meminfo | grep MemFree: && sleep 30; done; 

Что это хорошо, но мне было интересно, если есть лучший путь.


Редактировать: Четыре ответа до сих пор не совсем то, что я искал, я был недостаточно конкретным.

Похоже, что моя программа не является причиной утечки памяти; независимо от того, что я хотел посмотреть, могу ли я добавить код «c», который будет видеть/сообщать о свободной памяти в системе, а не о том, сколько памяти использует мой код (процесс).

ответ

0

Вы точно видите, что отсутствует системная память? На большинстве платформ unix это значение всегда будет стремиться к нулю. Причина: - блоки файловых систем кэшируются, если кто-то нуждается в них снова - блоки освобождаются только в том случае, если какой-либо процесс нуждается в памяти - эти блоки предпочтительны, потому что резервным хранилищем является файловая система , поэтому кража этих блоков дешево. .. нет необходимости выходить из страницы.

1

Команда watch полезна, попробуйте, например.

watch -n 1 ps v `pgrep ./myprogram` 

, но вы, конечно, может также попытаться сказать top, htop и их графические варианты, чтобы просто смотреть процесс.

Иначе вы можете попробовать то же самое, запросив свой идентификатор процесса, посмотреть/proc/$ PID и прочитать информацию о памяти оттуда, чтобы ваш printf мог сообщить об этом во время работы.

+0

'm ищет подпрограмму c, которая может сообщать размер свободной физической памяти. – Jamie

0

Вы можете попробовать использовать mallinfo (хотя это несколько устарели ... Я использовал его один раз с успехом) http://scaryreasoner.wordpress.com/2007/10/17/finding-memory-leaks-with-mallinfo/

Кроме того, njamd (или электрический забор, или любые другие LD_PRELOAD основе таНос отладчики могут помочь) : http://sourceforge.net/projects/njamd/

также mtrace могут быть интересны: http://en.wikipedia.org/wiki/Mtrace

2

Две библиотеки вызовов, которые могут быть использованы:

  • getrusage позволит вам получить текущую программу (и, необязательно, дочерние процессы). Размер резидентного набора;

  • sbrk(0) вернет текущую позицию разрыва программы, которая будет увеличиваться по мере увеличения размера кучи программы.

+0

Полезные инструменты сами по себе; но niether адресует то, что я ищу, c вызываемая процедура, которая может сообщить размер физической памяти бесплатно. – Jamie

Смежные вопросы