Trasovací nástroje
Kromě debuggeru se ke zjišťování chyb v aplikaci používá i několik speciálních nástrojů, kterým se říká trasovací. Trasovací nástroje umožňují sledovat a zaznamenávat (trasovat) chování aplikace během jejího běhu a my si pár z nich stručně představíme.
strace
Tato trasovací utilita slouží k vypisování všech systémových volání služeb jádra, které běžící aplikace za svého běhu zavolá. Výhodou je, že ji můžeme použít i pro aplikace, které neobsahují debugovací symboly. Proto s ní můžeme analyzovat i chování programů, ke kterým nemáme zdrojové kódy.
V případě, že je výpis volání velmi obsáhlý, lze sledování systémových volání s pomocí volby -e trace= zúžit na určitou podmnožinu volání, např. na síťové služby apod. Více informací najdete v manuálových stránkách utility strace.
Příklad zkráceného výstupu utility strace je na obrázku 1.10. Pomocí strace jsme spustili jednoduchou aplikaci hello, která vypíše na standardní výstup krátký text a skončí.
Kromě výpisu systémových volání umí utilita strace vygenerovat i jejich statistiku, ze které je patrný počet volání, návratové hodnoty, kolik času dané systémové volání trvalo apod. Tuto statistiku utilita strace generuje, pokud je spuštěna s volbou -c:
$ strace -c ./hello
Jen podotýkám, že pro analýzu na cílovém zařízení potřebujeme utilitu strace zkompilovanou pro naše cílové zařízení. Ne křížovou verzi (ta by nám byla k ničemu), ale nativní verzi pro cílovou platformu, která poběží spolu s analyzovanou aplikací na cílovém zařízení.
ltrace
Podobně jako strace umožňuje sledovat systémová volání, které aplikace zavolá, tak ltrace umí totéž pro volání knihovních funkcí. Jedinou podmínkou je, aby knihovny byly přilinkované k aplikaci dynamicky.
Příklad statistiky volání knihovních funkcí aplikací hello je na obrázku 1.11.
mtrace
Utilita mtrace je určena pro analýzu využití dynamické paměti sledovanou aplikací. S její pomocí můžeme najít chyby v používání funkcí malloc(), realoc() a free().
Za běhu sledované aplikace si utilita mtrace vytváří záznamy o alokování a uvolňování dynamické paměti. Tyto záznamy lze pak analyzovat pomocí perl skriptu (samy o sobě nejsou moc srozumitelné). S trochou štěstí se dozvíte, že všechna alokovaná paměť byla vaší aplikací vždy správně uvolněna. Nebo naopak obdržíte seznam funkcí s čísly řádků, kde jsou volání funkce malloc() a spol., jimž neodpovídá volání funkce free() pro uvolnění paměti.
Utilita mtrace je mírně intrusivní, tzn. že aplikace musí být zkompilována s její podporouVíce např. zde: http://math.acadiau.ca/ACMMaC/howtos/mtrace.html, protože volání funkcí pro alokaci dynamické paměti je nahrazeno voláním knihovních funkcí utility mtrace, resp. knihovny s ní dodávané.
Stejně jako u předešlých nástrojů je nutné mít utilitu mtrace a podpůrné knihovny nakonfigurované a zkompilované pro cílovou platformu, neboť na ní poběží.