Я работаю над Linux-программой, которая загружает много плагинов в виде общих объектов. Я хочу узнать, сколько памяти каждый общий объект и все его структуры данных занимают в определенный момент времени. Можно ли это сделать? При необходимости я могу изменить как основную программу, так и подключаемые общие объекты.
Это невозможно динамически, так как может случиться так, что общий объект A.so
динамически создает во время выполнения некоторые данные объекта B, которые затем уничтожаются совместно используемым объектом C.so
Таким образом, вы не можете сказать, что некоторые данные типа B "принадлежат к" конкретный общий объект; вы можете (и должны) иметь соглашения об этом. См. RAII, правило три, умные указатели ,....
Дело в том, что вопрос "сколько памяти используется данной библиотекой или общим объектом" не имеет смысла.Память и адресное пространство являются глобальными для процесса, поэтому разделяются основной программой и всеми общими объектами, библиотеками, плагинами...!
Однако вы можете использовать proc (5) для получения информации обо всем процессе. Изнутри программы читайте последовательно /proc/self/maps
чтобы получить карту своего адресного пространства. С внешней стороны программы читайте /proc/1234/maps
для процесса pid 1234.
Вы можете использовать valgrind. Подробнее об управлении памятью, сборке мусора, подсчете ссылок. Вы можете просмотреть свои проблемы, связанные с управлением ресурсами или сбором мусора. Возможно, вы захотите использовать консервативный сборщик мусора Boehm (если вы используете стандартные контейнеры C++, вы захотите использовать Boehm gc_allocator
, см. Это). Дело в том, что жизнеспособность некоторых данных является глобальным свойством программы, а не каким-либо конкретным плагином или функцией. Подумайте о круговых ссылках
Я хочу узнать, сколько памяти каждый общий объект и все его структуры данных занимают в определенный момент времени. Можно ли это сделать?
Если программа запущена, и у вас есть ее pid, вы можете проверить ее отображения памяти. Например:
% pmap 1234
[...]
00007f8702f6a000 148K r-x-- libtinfo.so.5.9
00007f8702f8f000 2044K ----- libtinfo.so.5.9
00007f870318e000 16K r---- libtinfo.so.5.9
[...]
Это не говорит вам о структурах данных и т.д.
pmap
просто печатает /proc/1234/maps