Как проверить утечку памяти?

У нас есть приложение с сотнями возможных действий пользователя, и мы думаем, как улучшить тестирование на утечку памяти.

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

Как мы можем это улучшить?

  • Внутренне проверить, что некоторые действия (например, «закрыть файл») действительно восстанавливают память и записывают ее?
  • Утверждать состояние памяти в наших модульных тестах (но кажется, что это утомительная задача)?
  • Вручную регулярно проверять время от времени?
  • Включать эту проверку каждый раз, когда реализуется новая пользовательская история?

На каком языке ты говоришь? Это язык со сборкой мусора, такой как Java или Perl, или язык без сборщика мусора, такой как C или C++?

j_random_hacker 07.01.2009 18:09

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

Patrick Cuff 07.01.2009 18:13
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
2
27 172
5

Ответы 5

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

Чтобы проверить, какие поля не удаляются, вы можете использовать JProfiler для Java.

На каком языке?

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

первая линия защиты:

  • контрольный список с общей памятью ошибки, связанные с распределением для Разработчики
  • правила кодирования

вторая линия защиты:

  • обзоры кода
  • статический анализ кода (как часть процесса сборки)
  • инструменты профилирования памяти

Если вы работаете с неуправляемым языком (например, C / C++), вы можете эффективно обнаружить большую часть утечек памяти, взломав функции управления памятью. Например, вы можете отслеживать все выделения / освобождения памяти.

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

  • Покрытие кода (с gcov или valgrind)
  • Использование памяти (с valgrind)
  • Освещение самих действий пользователя

Под «охватом действий пользователя» я подразумеваю такие утверждения:

  • Для каждой пары действий A и B, если существует значимая последовательность действий, в которой сразу за A следует B, то мы протестировали такую ​​последовательность.

Если это не так, то вы можете спросить, для какой доли пар A и B это правда.

Если у вас достаточно циклов ЦП, вы, вероятно, также выиграете от запуска valgrind или другого инструмента проверки памяти либо перед каждой фиксацией в репозитории исходного кода, либо во время ночной сборки.

Автоматизируйте!

Замените новый и Удалить своими пользовательскими версиями и регистрируйте каждый акт распределения / освобождения.

Если говорить в целом (не о тестировании, а о том, чтобы бороться с проблемой в ее происхождении), то смарт-указатели помогают избежать этой проблемы. К счастью, стандарт C++ 11 предоставляет новые удобные классы интеллектуальных указателей (shared_ptr, unique_ptr).

Другие вопросы по теме