Как измерить общий размер моих глобальных переменных? - PullRequest
11 голосов
/ 26 февраля 2010

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

Ответы [ 3 ]

10 голосов
/ 26 февраля 2010

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

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

-Wl, -Map = output.map

8 голосов
/ 26 февраля 2010

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

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

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

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

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

2 голосов
/ 26 февраля 2010

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

...