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