У меня есть приложение, работающее на 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};
...
}
из которых есть много в коде. Когда этот цикл возникает, и создает эти переменные или указатели, он просто использует свободное пространство или использует пробелы с последней итерации?
Нет ничего плохого в этом коде. Ошибка должна быть в другом месте. –
Зачем вам нужен компилятор на устройстве ?! –
В ответ на последние два фрагмента: код должен использовать пробел с последней итерации. Если он каждый раз выделял больше места, он бы переполнил стек (поскольку эти переменные выделяются в стеке). Обратите внимание, что вы можете посмотреть код сборки, чтобы подтвердить это. Скомпилируйте с '-S', чтобы получить код сборки, или посмотрите на код сборки с помощью отладчика. – user3386109