Профилирование памяти во время выполнения в C ++ - PullRequest
3 голосов
/ 19 октября 2011

Я знаю, что уже есть несколько потоков для профилирования памяти с помощью массива и других инструментов, но мне интересно, есть ли какие-либо инструменты или общие методы для профилирования памяти во время выполнения в производственной среде.

Можно представить реализацию, в которой каждый класс предоставляет функцию memSize (), и контейнеры расширяются, чтобы делать то же самое, вызывая memSize () для всех своих членов и добавляя их собственный размер (или оценку размера).Затем в любой момент времени вы можете запросить приложение и посмотреть, какая из ваших основных структур данных использует большую часть вашей памяти и как это меняется со временем.

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

Итак, чтобы перейти к актуальному вопросу - каков хороший способ мониторинга использования памяти и причины роста памяти во время выполнения впроцесс производства?

1 Ответ

2 голосов
/ 19 октября 2011

Если вы готовы:

  • реализовать собственное управление памятью; или
  • создает оболочки вокруг функций выделения памяти / удаления, которые вы используете

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

  • 1012 * Отметка времени *
  • идентификатор потока
  • размер блока
  • трассировка стека во время выделения

У нас есть механизм, с помощью которого мы можем попросить систему просмотреть список блоков (связанный список) и выгрузить приведенную выше информацию для каждого блока в файл .csv. Это может быть вызвано автоматически, когда системе не хватает памяти или когда она обнаруживает повреждение памяти, а также может быть вызвано вручную в любое время. Как только файл .csv сгенерирован, у нас есть Perl-скрипт, который переваривает его и группирует запросы на основе исходного потока, трассировки стека и т. Д. Это очень удобно, например, оно позволяет нам увидеть, сколько памяти и сколько выделений пришел из данного места в коде.

Методика, которую мы находим чрезвычайно полезной при обнаружении утечек, заключается в создании двух или более отчетов .csv в разное время во время выполнения какого-либо процесса. Сравнение журналов переваренной памяти позволяет нам легко обнаружить утечку памяти.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...