Как определить объем свободной памяти в программе, работающей в Linux? - PullRequest
1 голос
/ 08 октября 2009

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

Если не делать что-то вроде «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', который будет видеть / сообщать о свободной памяти в системе, а не то, сколько памяти использует мой код (процесс).

Ответы [ 4 ]

2 голосов
/ 09 октября 2009

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

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

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

1 голос
/ 08 октября 2009

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

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

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

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

0 голосов
/ 23 октября 2009

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

0 голосов
/ 09 октября 2009

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

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

также, mtrace может представлять интерес: http://en.wikipedia.org/wiki/Mtrace

...