Обнаружение и устранение утечки памяти в приложении Linux - PullRequest
3 голосов
/ 07 ноября 2011

У нас очень большой проект, который представляет собой приложение, использующее программирование приложений Linux и работающее на процессоре PowerPC. Этот проект изначально был разработан другой компанией. Мы приобрели проект у компании и сейчас поддерживаем проект.

В приложении много проблем с memory leak. Поскольку это большой проект, невозможно перейти к каждому файлу исходного кода и обнаружить утечку памяти. Мы использовали Valgrid, mpatrol и другие инструменты для обнаружения утечек памяти. Эти инструменты не сильно помогли, и утечка памяти не уменьшилась на значительный процент.

В этой ситуации, как поступить, чтобы уменьшить утечку памяти на значительную величину. Есть ли general method, которую люди используют в этом случае для уменьшения утечки памяти, кроме инструментов обнаружения утечки памяти, как упомянуто выше. 1007 *

Ответы [ 3 ]

2 голосов
/ 07 ноября 2011

Обычно Valgrind принадлежит к лучшим инструментам для этой задачи.Если это не работает должным образом, вы можете сделать только несколько вещей.

  • Первый вопрос: на каком языке приложение?Valgrind очень хорош для C и C ++, но не поможет вам с мусором или языком сценариев.Поэтому сначала проверьте язык.Может быть что-то подобное для java, но я не использовал столько java, так что вам нужно было бы спросить кого-то еще.

  • Поиграйте много с настройками valgrind.Есть несколько плагинов, которые могут помочь с этим.Одним из примеров может быть использование --leak-check=full или аналогичные параметры.Существуют также плагины для valgrind, которые могут расширить возможности его обнаружения.

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

  • Добавьте свой собственный трекер памяти.Например, в C ++ можно подключиться к вызовам new / delete и заставить их отслеживать память.Есть несколько библиотек, которые вы можете использовать для этого.Вы также можете написать собственную новую / удалить замену примерно в 500 LOC.Если вы решите использовать этот метод, обязательно прочитайте множество руководств по замене new / delete, поскольку при попытке выполнить эту задачу есть несколько необычных вещей в мире C ++.

  • Почему вы так уверены, что в приложении есть утечка памяти (т.е. как это было обнаружено)?Если инструмент только что сообщил об огромных количествах выделенной памяти, это может даже не означать, что есть фактическая утечка памяти.Утечка памяти означает, что дескрипторы памяти утеряны, и, следовательно, становится невозможным каждый охват и освобождение этой памяти снова.Если ваше приложение просто получает много памяти и сохраняет ее доступной, у вас, вероятно, совершенно другая проблема.Например, вы можете просто использовать алгоритм с плохой пространственной сложностью в той или иной точке, что приводит к множеству распределений.В этом случае вам не понадобится детектор утечки, а скорее профилировщик памяти, который дает вам более подробный обзор объема памяти частей кода.Однако я никогда раньше не использовал профилировщик для такого рода задач, поэтому я не могу дать вам больше подсказок по этому вопросу.

1 голос
/ 07 ноября 2011

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

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

0 голосов
/ 09 ноября 2011

Возможно, вы могли бы также рассмотреть возможность использования сборщика мусора Boehm (который использует GC_malloc вместо malloc и т. Д ... и не беспокоиться о free -го данных).

...