Я создаю программу c, которую я намерен запускать на ARM-процессоре в ближайшем таймфрейме. Я хочу измерить объем памяти, который я использую, с моими глобальными переменными, игнорируя размер стека/кучи. Есть ли способ получить gcc, чтобы выгрузить это во время компиляции или получить эту информацию из скомпилированного двоичного файла?
Как измерить общий размер моих глобальных переменных?
Ответ 1
Отличный способ увидеть, куда идет ваша память, - это посмотреть на карту компоновщика. Карта компоновщика - это файл, который создается компоновщиком и детализирует все ячейки памяти для программы. Вы можете видеть распределение памяти на основе символа по символам для глобальных переменных, а также кода. Я использовал компоновщики в прошлом для проектов, которые требуют жестких требований к памяти. Они позволяют легко идентифицировать проблемы, такие как глобальные буферы памяти, которые занимают много места.
Добавьте этот параметр в командную строку gcc для создания карты компоновщика:
-Wl, -Map = output.map
Ответ 2
В комплект GNU binutils входит программа под названием "размер", которая является самым простым способом получения необходимых данных - или, по крайней мере, разумной аппроксимации. Для типичной программы (в данном случае не маленькой встроенной) выход может выглядеть так:
text data bss dec hex filename
332268 2200 19376 353844 56634 test-directory/add
Первые три столбца представляют собой размеры разделов в двоичном формате: "текст" - это исполняемый код, "данные" - это константы и т.д., в том числе те, которые представляют начальные переменные с явными инициализаторами - и "bss" - инициализаторы для всего, что неявно статически инициализируется. В типичной встроенной программе эти статические инициализаторы в значительной степени предназначены исключительно для глобальных переменных (и для ваших целей вам может потребоваться включить другие статические переменные в измерение, так как они также не находятся в стеке или куче).
Таким образом, я думаю, что вы в конечном итоге получаете сумму "данных" и "bss", которые, по сути, вы хотите. (После прочтения статьи, связанной с hłddal, я менее уверен в этом, чем я, возможно, комментаторы могут добавить подтверждение?)
(После этого "dec" и "hex" - это общий размер всего в десятичном и шестнадцатеричном, а "filename", конечно, очевидно.)
Ответ 3
Вам нужно проанализировать различные сегменты памяти с помощью objdump
. См. здесь для статьи и here для получения другого ответа, который дает некоторые подробности на этом.