2010-02-25 11 views
11

Estoy creando un programa c que pretendo ejecutar en un procesador ARM en el marco de tiempo cercano. Quiero medir la cantidad de memoria que estoy usando con mis variables globales sin tener en cuenta el tamaño de la pila/pila. ¿Hay alguna manera de obtener gcc para volcar esto en tiempo de compilación o para recuperar esta información del binario compilado?¿Cómo mido el tamaño total de mis variables globales?

Respuesta

10

Una excelente manera de ver a dónde va su memoria es mirar el mapa del enlazador. Un mapa de enlace es un archivo generado por el vinculador y detalla todas las ubicaciones de memoria para el programa. Puede ver la asignación de memoria en un símbolo por símbolos para las variables globales, así como el código. He utilizado mapas de enlazado en el pasado para proyectos que tienen requisitos de memoria ajustados. Facilitan la identificación de áreas problemáticas como los búferes de memoria global que ocupan mucho espacio.

Añadir esta opción para la línea de comando gcc para generar el mapa enlazador:

-Wl, -Mapa = output.map

2

Necesita analizar los diferentes segmentos de memoria con objdump. Consulte here para obtener un artículo y here para obtener otra respuesta que proporcione algunos detalles al respecto.

7

El conjunto de binutils de GNU contiene un programa llamado "tamaño", que es la forma más fácil de obtener los datos que necesita, o al menos una aproximación razonable. Para un programa típico (en este caso, no uno pequeño incrustado), el resultado sería algo así como:

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

Las tres primeras columnas son tamaños de las secciones en el binario: "texto" es el código ejecutable, "datos" son constantes y demás, incluidos los que representan variables iniciales con inicializadores explícitos, y "bss" son los inicializadores de todo lo que se inicializa implícitamente estáticamente. En un programa embebido típico, esos inicializadores estáticos son casi exclusivamente para variables globales (y, para sus propósitos, es posible que desee incluir las otras variables estáticas en su medición, ya que tampoco están en la pila o en el montón).

Por lo tanto, creo que terminas con la suma de "datos" y "bss" siendo esencialmente lo que quieres. (Después de leer el artículo hlovdal vinculado a, estoy menos seguro de esto que yo, tal vez los comentaristas pueden agregar confirmación?)

(Después de eso, "dec" y "hex" son el tamaño total de todo en decimal y hexadecimal, y "nombre de archivo" es por supuesto obvio.)