2010-02-25 24 views
11

Tworzę program c, który zamierzam uruchomić na procesorze ARM w najbliższym czasie. Chcę zmierzyć ilość pamięci używanej przez moje zmienne globalne, ignorując rozmiar stosu/sterty. Czy jest jakiś sposób, aby uzyskać GCC, aby zrzucić to w czasie kompilacji lub odzyskać te informacje ze skompilowanego pliku binarnego?Jak zmierzyć całkowity rozmiar moich zmiennych globalnych?

Odpowiedz

10

Świetnym sposobem na sprawdzenie, gdzie jest twoja pamięć, jest spojrzenie na mapę linkera. Mapa linkera jest plikiem wygenerowanym przez linker i zawiera szczegółowe informacje o wszystkich lokalizacjach pamięci programu. Możesz zobaczyć alokację pamięci dla symbolu za symbol dla zmiennych globalnych, jak również kodu. W przeszłości korzystałem z map linkerów dla projektów, które mają małe wymagania dotyczące pamięci. Ułatwiają identyfikację problemów takich jak globalne bufory pamięci, które zajmują dużo miejsca.

Dodaj tę opcję do linii poleceń gcc wygenerować mapę łącznikową:

-Wl, -map = output.map

2

Należy przeanalizować różne segmenty pamięci za pomocą objdump. Zobacz artykuł here dla artykułu i here dla innej odpowiedzi, która podaje kilka szczegółów na ten temat.

7

Zestaw GNU binutils zawiera program o nazwie "rozmiar", który jest najłatwiejszym sposobem uzyskania potrzebnych danych - lub przynajmniej rozsądnego przybliżenia. Dla typowego programu (w tym przypadku, a nie mały wbudowany jeden), wyjście może wyglądać następująco:

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

Pierwsze trzy kolumny są rozmiary sekcjach binarne: „tekst” jest kod wykonywalny, "dane" to stałe i tak dalej - w tym te, które reprezentują zmienne początkowe z jawnymi inicjalizatorami - a "bss" to inicjatory dla wszystkiego, co zostaje domyślnie zainicjalizowane statycznie. W typowym programie wbudowanym te inicjatory statyczne są w zasadzie wyłącznie dla zmiennych globalnych (i, dla twoich celów, możesz chcieć uwzględnić inne zmienne statyczne w twoim pomiarze mimo to, że nie są one również na stosie lub stercie).

W związku z tym wydaje mi się, że otrzymujesz sumę "danych" i "bss" w istocie, czego chcesz. (Po przeczytaniu artykułu związanego z Hlovdal, jestem mniej pewny tego niż ja, może komentujący mogą dodać potwierdzenie?)

(Po tym, "dec" i "hex" są całkowitą wielkością wszystkiego w systemie dziesiętnym i szesnastkowo, a "nazwa pliku" jest oczywiście oczywista.)

Powiązane problemy