MPR
GNU Profiler

Stránka obsahuje popis dvou programů (nástrojů) - MPR, GNU Profiler - určených pro ladění programů. Jedná se o tzv. profilery, tedy programy umožňující zkoumat určité vlasnosti programu - v našem případě

  1. operace s pamětí - kde a kolik paměti bylo přiděleno/uvolněno (MPR)
  2. strojový čas - kde a kolik bylo potřeba času při běhu programu (GNU Profiler)
  3. off-line trasování programu - jaké, kolikrát a odkud byly volány jednotlivé funkce (GNU Profiler/MPR)
Získané informace by měly pomoci odhalit chyby v programech a ukázat kde je potřeba program optimalizovat.




princip
požadavky
nástroje
překlad
profilování
výsledky
parametry
příklad
závěr

Princip

MPR je, jak o něm tvrdí jeho autor, a poor man's memory profiling package. Je to poměrně malý a jednoduchý balíček programů, avšak ohromně užitečný. Část je napsaná v C, ale větší část jsou awkovské skripty. MPR pracuje tak, že se pověsí na paměťové rutiny libc a za běhu profilovaného programu si dělá poznámky do log souboru. Ty je pak možné prohlížet a vyhodnocovat.

Požadavky

Popisovaná verze mpr je 1.5 a k jejímu používání je potřeba
  1. libc s GNU malloc - myslím, že to není bezpodmínečně nutné a stačí myslím jen "novější" libc, ale autor uvádí GNU malloc
  2. gdb - GNU Debugger - pouze pokud budete chtít používat parametry mpr -l -f

Seznam nástrojů

  1. mpr - mapuje program country profilovaného programu na jména funkcí, případně na jména zdrojových souborů a čísla řádek zdrojových souborů
  2. mprcc - filtr - združuje paměťové požadavky podle call-chains (řetěz volání - napr. main/foo/bar)
  3. mprlk - filtr - najde memory leaks (paměť která byla přidělena ale nebyla uvolněna)
  4. mprhi - vygeneruje histogram - velikost používané paměti
  5. mprsz - filtr - združuje paměťové požadavky podle velikosti přidělované/uvolňované paměti

Jak přeložit program s MPR

Program je potřeba kompilovat s frame-pointer supportem. Ten je většinou zapnutý, v případě gcc to znamená, že bys neměl při kompilaci používat parametr -fomit-frame-pointer, u některých překladačů ani optimalizaci, např. -O3.

Program stačí jinak normálně zkompilovat, je dobré použít -g aby jsi mohl použít parametry mpr -l -f.

Při linkování programu je potřeba přilinkovat knihovnu libmpr např.

    gcc ... -lmpr ...

Jak pustit program s MPR - profilování

MPR používá několik environment proměnných. Aby jsi mohl spustit program s mpr a získat log soubor, je potřeba nastavit proměnné MPRPC a MPRFI. Nejjednodušší varianta - program spusť takhle (v bourne shell)

    MPRPC=`mprpc a.out` MPRFI="cat >log" a.out ...
kde a.out nahraď jménem tvého programu. Mě se osvědčilo udělat si jednoduché skripty.

Ještě k významu proměnných

  1. MPRPC - tady má mpr nějakou magickou hodnotu ?? program counter ?? každopádně je potřeba nastavit tuhle proměnnou po každé rekompilaci
  2. MPRFI - příkaz pro ukládání log souboru - tady můžete log informace před uložením filtrovat

Získání výsledků / informací

Výsledky získáte z log souboru. Velikost log souboru závisí na tom, kolik paměťových požadavků měl za běhu profilovaný program a může být i několik MB. Proto je vhodné údaje nejprve profiltrovat skrz mprlk/mprcc/mprsz a teprve pak namapovat pomocí mpr. Uvedu několik příkladů.

Takhle dostanu funkce s memory leaky

    mprlk < log | mpr a.out

Takhle dostanu funkce s memory leaky sdružené podle velikosti požadavků a s jmény zdrojových souborů a čísly řádků

    mprlk < log | mprsz | mpr -l -f a.out

Parametry mpr

Teď se zmíním ještě o některých důležitých parametrech mpr. O dalších parametrech, hlavně ostatních nástrojů, se můžete dočíst v mpr.doc

mpr má tyto parametry

parametrpříkl.vysvětlení
-i-i xmallocjména funkcí, která se vyřadí z call-chainu
-I-I"#"odďelovač jmen funkcí v parametru -i - někdy se čárka nehodí (např. pokud používáte C++)
-fdo výsledků přidá jména zdrojových souborů
-F-F foo.cdo výsledků přidá jména vyjmenovaných zdrojových souborů
-ldo výsledků přidá čísla řádek ve zdrojových souborech
-p pro programy v C++ - odstraní z jmen funkcí údaje o parametrech

Příklad výstupu z mpr

Příklad výstupu z mpr. Obsahuje funkce s memory leaky.

Získán

mprlk < mapa.log > mapa.log1 mpr -l -f -I\# -i 'calloc#___builtin_new#___builtin_vec_new' mapa < mapa.log1 > mapa.log2 mprcc < mapa.log2 > mapa.mpr

V ukázce výstupu si všimněte rádku s ???. Ten odpovídá požadavkům z funkcí, ke kterým nejsou dostupné informace. Většinou jsou to funkce z libc a dalších knihoven bez ladících informací.

Závěr

mpr se dá stáhnou např. z archivu sunsite

v adresáři devel

Jinak mi mpr připadá jako velice povedený a užitečný nástroj, který ušetří spoustu času při ladění programů, přitom je malý a jednoduchý.

princip
překlad
profilování
výsledky
příklad
závěr

Princip

GNU profiler umožňuje sledovat jednak strojový čas strávený v jednotlivých rutinách programu a jednak kolikrát a odkud byla zavolána. Sledování času se provádí samplováním, program se po určitém čase přeruší (10ms) a profiler se podívá, kde k přerušení došlo. Díky samplování výsledky nejsou přesné a je třeba aby rutina běžela dostatečně dlouho (např. >100ms). Sledování volání je naproti tomu přesné. Je umožněno překladačem, který při překladu programu (určeného pro profiling) přidává do programu specialní kód, který se stará o sledování. Vlastní profiling pak vypadá tak, že se spustí profilovaný program a po jeho ukončení se analyzuje soubor s profile daty.

Překlad

Při překladu a linkování je potřeba přidat parametr -pg. Pro profilování knihovních rutin je potřeba mít knihovnu zkompilovanou s parametrem překladače -pg. Dodává se např. libc_p.a s gcrt0.o.

Profilování

Profilování programu probíhá tak, že program spustíš. Nezapomeň, že je profilována jen ta část kódu, do které se program opravdu dostane.

Výsledky

Výsledky profilování získáš spuštěním GNU profileru - program gprof - s parametrem jméno profilovaného programu. (Např. gprof mpg123) gprof je potřeba spustit v tom samém adresáři, kde běžel profilovný program, protože při běhu profilovaného programu se vytváří soubor gmon.out s daty pro gprof. gprof má samozřejmě ještě další parametry viz. dokumentace. Výstup gprof obsahuje jednak flat profile - časy a další údaje k jednotlivým rutinám a dále call graph - graf volání rutin s dalšími údaji - formát je trošku složitý, ale je rovněž dobře popsán v dokumentaci.

Příklad výstupu z gprof

Příklad výstupu z gprof. Vzniknul profilováním přehrávače audio mpegu - mpg123.

Závěr

GNU profiler je součástí balíku binutils a dá se stáhnou např. z archivu sunsite

v adresáři GNU/packages




Stránku připravil Radek Doulík