Странное поведение: Потребляет ли libasan системную память постоянно в Linux?

Вопрос или проблема

Я работаю с встроенной системой Linux (ядро-5.10), и кросс-компилятор GCC поддерживает только -fsanitize=address для address sanitizer.

Затем я создал тестовую программу с использованием -fsanitize=address и -lasan. Когда я запустил программу в фоновом режиме, я проверил использование системной памяти с помощью команды free.

К моему удивлению, данные о available в команде free постоянно уменьшаются!
Программа завершается oom killer примерно через 1 час.
При этом ASAN не сообщает о больших утечках памяти!

Если я создаю ту же программу без ASAN, нет такого постоянного потребления памяти программой.

Так почему же включение ASAN вызвало такое резкое потребление памяти? Это ошибка программы или ASAN?

Спасибо,

Ответ или решение

Теория: Ваша проблема связана с использованием адресного санитайзера (ASAN) в среде Linux. ASAN — это инструмент, который позволяет выявлять и отлаживать ошибки, связанные с памятью, такие как переполнение буфера, использование освобождённой памяти и др. Однако при использовании ASAN возможно увеличение потребления памяти, так как он требует дополнительных ресурсов для хранения информации о состоянии каждого блока памяти, а также для проверки операций с памятью.

Пример: Вы построили тестовое приложение с параметрами компиляции -fsanitize=address и -lasan. При запуске приложение начало стабильно потреблять память до момента, пока система не завершила его работу с помощью механизма уничтожения процессов Out-Of-Memory (OOM killer). При этом, если та же программа была собрана без ASAN, подобного повседневного потребления памяти не возникало.

Применение: Увеличение потребления памяти при использовании ASAN может быть обусловлено несколькими факторами:

  1. Ресурсные затраты ASAN: ASAN требует существенного количества дополнительной памяти для выполнения своих функций. Это может объяснить, почему программа, собранная с ASAN, показывает более значительное потребление памяти, даже в отсутствие отчетов о серьезных утечках.

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

  3. Неверное освобождение памяти в коде: Даже если ASAN не выявляет утечек памяти, возможно некорректное управление памятью в программе, что может усилить эффект, создаваемый ASAN.

Рекомендации для решения проблемы:

  • Оптимизация кода: Проверьте код на наличие неэффективного использования памяти и сделайте необходимые исправления.
  • Настройка ASAN: Рассмотрите возможность изменения параметров конфигурации ASAN, таких как размер хранилища кэша, для уменьшения его влияния на потребление памяти.
  • Альтернативные инструменты: Если проблема не решается, можно рассмотреть использование других инструментов для профилирования памяти, которые потребляют меньше ресурсов.

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

Оцените материал
Добавить комментарий

Капча загружается...