2016-10-28 1 views
-2

У меня есть приложение, работающее на ARM Cortex-A9. Когда я вхожу в определенную часть кода, я вижу в представлении задач Linux «top», что приложение растет в памяти, пока оно не будет убито из-за нехватки физической памяти.Отладка утечки памяти на C/C++ Приложение, запущенное на встроенном Linux-устройстве

Теперь я провел некоторое исследование по этому вопросу и попытался реализовать mtrace, но это не дало мне очень кратких результатов. В основном я получаю что-то вроде этого

Memory not freed: 
----------------- 
    Address  Size  Caller 
0x03aafe18  0x38 at 0x76e73c18 
0x53a004a8  0x38 at 0x76e73c18 

И я даже не думаю, что это большая проблема (может быть, еще меньше вопроса).

Я также не могу использовать Valgrind (который, вероятно, работать большой), потому что не хватает места на устройстве, чтобы установить его и компилятор ...

Так что я боюсь, что я просто должен пройти через код и искать что-то, что может вызвать растущее использование памяти. Есть ли руководство для этого где-то? В коде «malloc» или «new» почти никогда не используются.

У меня есть доступ к использованию gdb, если это может помочь.

Одно я не ясно, если следующая проблема:

while(someloop){ 
... 
    double *someptr; 
... 
} 

или как

while(someloop){ 
... 
    int32 someArray[100] = {0}; 
... 
} 

из которых есть много в коде. Когда этот цикл возникает, и создает эти переменные или указатели, он просто использует свободное пространство или использует пробелы с последней итерации?

+0

Нет ничего плохого в этом коде. Ошибка должна быть в другом месте. –

+0

Зачем вам нужен компилятор на устройстве ?! –

+0

В ответ на последние два фрагмента: код должен использовать пробел с последней итерации. Если он каждый раз выделял больше места, он бы переполнил стек (поскольку эти переменные выделяются в стеке). Обратите внимание, что вы можете посмотреть код сборки, чтобы подтвердить это. Скомпилируйте с '-S', чтобы получить код сборки, или посмотрите на код сборки с помощью отладчика. – user3386109

ответ

1

Если он расположен в стеке, память используется повторно. Однако, выкинув кучу, вам нужно удалить. Также, если вы alocate с двойным * ptr; ... ptr = new double [5], вам нужно удалить delete [] ptr.

В C++ вы можете перезаписать новые и удалить операторы для печати некоторого сообщения для отладки.

Лучше всего было бы отлаживать использование gdb и посмотреть, какой объект создан и не удален.

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

Совет: для небольших объектов, расположенных на стеке, быстрее и безопаснее.

Смежные вопросы