Как я измеряю общий размер своих глобальных переменных?

Я создаю c программу, что я намереваюсь работать на процессоре ARM в близкий период времени. Я хочу измерить объем памяти, который я использую со своими глобальными переменными при игнорировании размера стека/"кучи". Существует ли способ или заставить gcc разгрузить это во время компиляции или получить эту информацию от скомпилированного двоичного файла?

11
задан bradtgmurray 25 February 2010 в 23:59
поделиться

3 ответа

Отличный способ узнать, куда уходит ваша память, - посмотреть на карту компоновщика. Карта компоновщика - это файл, который генерируется компоновщиком и содержит подробное описание всех мест памяти программы. Вы можете увидеть распределение памяти по символам как для глобальных переменных, так и для кода. В прошлом я использовал карты компоновщика для проектов с жесткими требованиями к памяти. С их помощью легко определить проблемные области, такие как буферы глобальной памяти, которые занимают много места.

Добавьте эту опцию в командную строку gcc для создания карты компоновщика:

-Wl,-Map=output.map

10
ответ дан 3 December 2019 в 05:57
поделиться

Пакет GNU binutils содержит программу под названием «size», которая является самым простым способом получить нужные вам данные - или, по крайней мере, их разумное приближение. Для типичной программы (в данном случае не маленькой встроенной) результат может выглядеть следующим образом:

   text    data     bss     dec     hex filename
 332268    2200   19376  353844   56634 test-directory/add

Первые три столбца - это размеры разделов в двоичном файле: «текст» - это исполняемый код, «данные» - это константы и так далее, в том числе те, которые представляют начальные переменные с явными инициализаторами, а «bss» - это инициализаторы для всего, что неявно статически инициализируется. В типичной встроенной программе эти статические инициализаторы в значительной степени предназначены исключительно для глобальных переменных (и для ваших целей вы можете в любом случае включить другие статические переменные в свои измерения, поскольку они также не находятся в стеке или куче).

Таким образом, я думаю, что в итоге вы получите сумму «data» и «bss», которая будет, по сути, тем, что вы хотите. (После прочтения статьи, на которую ссылается hlovdal, я менее уверен в этом, чем был; возможно, комментаторы могут добавить подтверждение?)

(После этого «dec» и «hex» - это общий размер всего в десятичном и шестнадцатеричный, и "имя файла", конечно, очевидно.)

8
ответ дан 3 December 2019 в 05:57
поделиться

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

2
ответ дан 3 December 2019 в 05:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: