2010-02-25 18 views
11

Sto creando un programma c che intendo eseguire su un processore ARM nel prossimo lasso di tempo. Voglio misurare la quantità di memoria che sto usando con le mie variabili globali ignorando la dimensione dello stack/heap. C'è un modo per ottenere gcc per scaricarlo a tempo di compilazione o per recuperare queste informazioni dal binario compilato?Come si misura la dimensione totale delle variabili globali?

risposta

10

Un ottimo modo per vedere dove la memoria sta andando è quello di guardare la mappa linker. Una mappa del linker è un file generato dal linker e descrive in dettaglio tutte le posizioni di memoria per il programma. È possibile visualizzare l'allocazione della memoria su un simbolo in base al simbolo per le variabili globali e il codice. Ho usato le mappe di linker in passato per progetti che hanno requisiti di memoria stretti. Rendono facile identificare aree problematiche come i buffer di memoria globali che occupano molto spazio.

Aggiungi questa opzione alla riga di comando gcc per generare la mappa linker:

-Wl, -Map = output.map

2

è necessario analizzare i diversi segmenti di memoria con objdump. Vedere here per un articolo e here per un'altra risposta che fornisce alcuni dettagli su questo.

7

GNU binutils Suite contiene un programma chiamato "dimensione", che è il modo più semplice per ottenere i dati necessari - o, almeno, una ragionevole approssimazione. Per un tipico programma (in questo caso, non è una piccola incorporato), l'uscita potrebbe essere simile:

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

Le prime tre colonne sono dimensioni delle sezioni del binario: "testo" è il codice eseguibile, I "dati" sono costanti e così via - compresi quelli che rappresentano le variabili iniziali con inizializzatori espliciti - e "bss" è inizializzatori per tutto ciò che viene inizializzato implicitamente staticamente. In un tipico programma incorporato, quegli inizializzatori statici sono praticamente esclusivamente per variabili globali (e, per i tuoi scopi, potresti voler includere comunque le altre variabili statiche nella tua misura poiché non sono nemmeno nello stack o nell'heap).

Così, penso che si finisce con la somma dei "dati" e "BSS" essendo essenzialmente ciò che si desidera. (Dopo aver letto l'articolo hlovdal collegato a, sono meno sicuro di questo, forse i commentatori possono aggiungere conferma?)

(Dopo di che, "dec" e "hex" sono la dimensione totale di tutto in decimale ed esadecimale, e "nomefile" è naturalmente ovvio.)

Problemi correlati