Как проверить утечки памяти в приложении C на ARM Architecture - PullRequest
7 голосов
/ 18 ноября 2011

Я пишу код на C для устройства, которое использует архитектуру ARM.Я хочу проверить наличие утечек памяти в моем приложении.Как и в моем устройстве, в котором iam работает (архитектура ARM) не поддерживает Valgrind .. так что, какие другие опции я могу использовать для проверки утечек памяти в моем приложении.Есть ли способ проверить утечки памяти ... Или, пожалуйста, укажите, какие меры предосторожности я должен предпринять при написании кода, чтобы избежать утечек памяти, особенно при работе со строками и динамическим выделением памяти ..?

Платформа:Linux, компилятор gcc

Ответы [ 3 ]

10 голосов
/ 18 ноября 2011

В настоящее время Valgrind действительно поддерживает ARM (даже поддерживает инструкции NEON SIMD). Если вы используете Debian или Ubuntu, вы можете установить valgrind через apt. Возможно, вам придется включить тестирование / нестабильные репозитории, но пакет существует.

Или вы, конечно, можете скомпилировать его самостоятельно (я пробовал, и это работает).

4 голосов
/ 18 ноября 2011

Не использовать динамическое выделение памяти. По крайней мере, мы не в системах авионики.

Я обычно использую либо

  1. выделение необходимой памяти только при инициализации.
    Если это не удается, то для приложения требуется больше памяти. Это используется в случае, когда драйверу необходимо отслеживать N объектов, но N необходимо настраивать для каждого проекта / приложения. В ОС, которые я использую, для приложения предоставляется максимальное значение памяти.

  2. Использовать связанный список бесплатных и использованных предметов Это работает лучше всего, если элементы имеют фиксированный размер. Затем при инициализации драйвер считывает элементы конфигурации, которые определяют максимальное количество элементов, которые он будет поддерживать. Это может быть malloc'd из пространства ядра. Если памяти недостаточно, необходимо правильно указать системные ресурсы.

  3. Используйте пул памяти, из которого приложение может выделить, но удалить только целиком. Во встроенных системах OpenGL для авионики мы позволяем приложениям создавать объекты переменного размера. Как только пул исчерпан, мы возвращаем ошибку OUT_OF_MEMORY. Мы НЕ разрешаем приложению случайным образом удалять объекты, так как это приведет к фрагментации памяти и недетерминированному поведению во время выполнения. Мы разрешаем им удалять каждый объект и воссоздавать их по мере необходимости. Это имеет детерминированное поведение.

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

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

Рассмотрите возможность создания симулятора для устройства ARM на настольном компьютере. В зависимости от сложности и сложности ввода / вывода встроенного приложения это может варьироваться от тривиального до чрезвычайно сложного.

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

...