рассчитать объем памяти, используемый конкретным процессом в Linux

Я пишу программу для отслеживания каждого системного вызова, вызываемого дочерним процессом, и определения точного использования памяти (исключая совместное использование памяти).

вот мой план.

пусть дочерний процесс трассируется отцовским процессом,

если дочерний процесс выполняет системные вызовы, родительский процесс получит SIGTRAP,

затем получите идентификатор системного вызова с помощью ptrace(PTRACE_PEEKUSER, child_pid, 4*ORIG_EAX, NULL).

когда идентификатор равен SYS_brk, SYS_sbrk, SYS_mmap2, SYS_mmap, SYS_mremap, SYS_munmap,

я могу получить параметры вызова и рассчитать объем использования памяти.

но меня это беспокоит

  1. Я не уверен, как рассчитать.

  2. SYS_mmap2 имеет более 6 параметров, как мне их получить?


person lx75249    schedule 27.02.2012    source источник
comment
Что не так, например. анализ вывода ps?   -  person Dietrich Epp    schedule 27.02.2012
comment
@DietrichEpp, по крайней мере, вы должны использовать такую ​​библиотеку, как libprocps4-dev, и не читать вывод ps.   -  person Alexis Wilke    schedule 20.07.2016


Ответы (1)


Чтобы определить использование памяти для процесса pid 1234, я предлагаю последовательно прочитать и проанализировать псевдофайл /proc/1234/maps или /proc/1234/smaps. Другие файлы под /proc/1234/ также могут иметь значение (например, /proc/1234/statm и /proc/1234/status)

Изнутри процесса вы можете прочитать /proc/self/maps или /proc/self/smaps (и, например, /proc/self/statm и /proc/self/status).

Подробнее читайте на proc(5) справочной странице.

Существует также команда pmap.

person Basile Starynkevitch    schedule 27.02.2012
comment
[стек], возвращаемый pmap, - это то, что я хочу. - person lx75249; 28.02.2012
comment
[stack] также находится внутри /proc/1234/maps, который pmap фактически читает. - person Basile Starynkevitch; 28.02.2012