Протокол malloc

Протокол malloc - это дополнительное расширение подсистемы malloc, позволяющее пользователю получать информацию об активных областях, выделенных вызывающим процессом. Эти данные могут применяться для определения причин возникновения неполадок и анализа производительности.

Данные из протокола malloc

Для каждой активной области в протокол malloc заносятся следующие данные:
  • Адрес, переданный в вызывающий процесс.
  • Размер выделяемой области.
  • Куча, из которой была выделена область.
  • Данные трассировки стека вызывающей функции. Глубину трассировки можно настроить.
Дополнительно можно настроить занесение в протокол следующей информации:
  • ИД вызывающего процесса.
  • ИД вызывающей нити.
  • Порядковый номер выделения (с момента начала работы процесса).
  • Точное время выделения.

При ведении протокола malloc каждая успешная операция выделения памяти требует дополнительных затрат для сохранения метаданных. Для 32-разрядных приложений эти затраты составляют 50-100 байт, 64-разрядные расходуют в два раза больше. Точное значение зависит от текущих параметров.

Информация протокола malloc может быть получена следующими способами:
  • Командой DBX подсистемы malloc.
  • С помощью опции отладки report_allocations.

Включение протокола malloc

По умолчанию протокол malloc не ведется. Для включения функции ведения протокола malloc с параметрами по умолчанию присвойте переменной среды MALLOCDEBUG следующее значение:
MALLOCDEBUG=log
Для включения функции ведения протокола malloc с пользовательскими параметрами присвойте переменной среды MALLOCDEBUG следующее значение:
MALLOCDEBUG=log:extended,stack_depth:6
Прим.: Ниже перечислены значения по умолчанию для параметров протокола malloc:
extended
Значение по умолчанию - выключено. Этот параметр позволяет включить ведение протокола метаданных операций выделения памяти, упомянутых выше. Он влияет на количество дополнительных ресурсов, требуемых для каждой операции. Эта опция не имеет эффекта, если MALLOCTYPE равен watson2.
глубина-стека
Задает глубину стека вызовов, содержимое которого сохраняется при выполнении каждой операции выделения памяти. Он влияет на количество дополнительных ресурсов, требуемых для каждой операции. Значение по умолчанию - 4, максимальное значение - 64.

Ограничения

Применение протокола malloc может привести к снижению производительности всех программ из-за выполнения дополнительных операций записи данных в память. Кроме того, возрастет объем используемой памяти.