Я хотел бы отслеживать, сколько памяти занимают различные программы, находясь в определенных состояниях. Например, у меня есть графическая программа. Когда он свернут, он может использовать значительно меньше памяти, поскольку он не будет перерисовывать окно, что требует чтения изображений и шрифтов и выполнения большого количества библиотечных функций. Эти объекты по-прежнему доступны в памяти, но фактически не используются.
Такие инструменты, как top, имеют ограниченное применение, поскольку они просто сообщают, сколько памяти отображено в адресное пространство программы, а какая - резидентно в физической ОЗУ. Точно так же детекторы утечки сообщают только о недоступности памяти, а не о том, что она просто не используется.
Есть ли существующий инструмент, который может таким образом отслеживать активно используемую / неиспользуемую память? Если возможно, я хотел бы отслеживать использование не только в куче, но и в памяти, где хранится код программы / библиотеки.
РЕДАКТИРОВАТЬ: Я хотел бы уточнить: я хочу знать много памяти, которую программа действительно читает, записывает или выполняет после определенного момента, то есть, когда она достигает определенного состояния. Хотя количество страниц в адресном пространстве и количество резидентных страниц являются важными измерениями, это не то, что я ищу.
Сейчас я использую три подхода:
- Я написал библиотеку, которая очищает биты защиты всех областей памяти (кроме стека и собственного кода), считываемых из / proc / self / maps с помощью mprotect. У него есть обработчик segfault, который восстанавливает биты защиты и увеличивает счетчик. Я загружаю его с помощью LD_PRELOAD, и он начинает отслеживать доступ к памяти при получении сигнала. Это привело к некоторым подлинным сбоям с кажущимися поддельными адресами (они не сохраняются ни в каких регистрах или соседней памяти во время сбоя).
- Я написал программу «purge», которая выделяет и читает из памяти с помощью «mmap», пока «mmap» не вернет ошибку. Мы надеемся, что это вытеснит все страницы из целевого процесса, который приостанавливается на время выполнения `purge`. Затем я подсчитываю количество страниц, когда целевой процесс возобновляется, используя pidstat. Кажется, это работает, но это очень тупой инструмент. Он не дает никакой информации о том, какие страницы были затронуты.
- Мне сказали, что valgrind позволяет писать плагины, которые вызывают выполнение определенных действий при определенных событиях, например, при доступе к памяти. Пока это выглядит многообещающим.