mpr =-= There was once a programmer who worked upon microprocessors. "Look at how well off I am here," he said to a mainframe programmer who came to visit, "I have my own operating system and file storage device. I do not have to share my resources with anyone. The software is self-consistent and easy-to-use. Why do you not quit your present job and join me here?" The mainframe programmer then began to describe his system to his friend, saying: "The mainframe sits like an ancient sage meditating in the midst of the data center. Its disk drives lie end-to-end like a great ocean of machinery. The software is a multi-faceted as a diamond and as convoluted as a primeval jungle. The programs, each unique, move through the system like a swift-flowing river. That is why I am happy where I am." The microcomputer programmer, upon hearing this, fell silent. But the two programmers remained friends until the end of their days. -- Geoffrey James, "The Tao of Programming" Mpr (neboli Poor mans memory profiler) je jedna z nejklasičtějších utilit pro kontrolu paměti. Narozdíl od ostatních utilit se specializuje pouze na odstraňování zapomenutých bloků paměti. Ostatní kontroly přenechává funkci mcheck popsané výše. Jeho funkce opravdu připomína profiler. Speciální knihovna napřed vytvoří log soubor obsahující záznamy o všech voláních malloc/free apod. Později tento log můžete analyzovat několika utilitkama a studovat chování programu. Mezi zajímavé utilitky patří progrémek pro generování histogramu využití paměti z hvězdiček. Nevím k čemu to je dobré, ale vypadá to hezky. Použití je poněkud komplikovanější, než u ostatních programů: napřed je nutné vytvořit log. K tomu je nutné zalinkovat knihovnu libmpr.a a nastavit shellové proměnné a spustit vlastní program: MPRPC='mprpc tst' MPRFI="cat >log" ./tst proměnnou MPRRC je nutné nastavovat znova po každém překompilování programu Pak je možné analyzovat soubor. K tomu slouží několik utilit. Nejzákladnější je utilita mpr, která převádí adresy na symboly. Výstupem je pak seznam všech volání alokace paměti spolu s číslem řádky a jménem funkce. Výpis je většinou velmi dlouhý a ne přiliš přehledný. Utilitou mprcc je možné seskupit záznamy o funkcích volaných na stejném místě programu, utilitka mprlk vyhledá pouze neuvolněné alokace, mprhi vytvoří histogram a mprsz seřadí záznamy podle velikosti. Podle mých zkušeností mpr neumí nic nového oproti ccmallocu, jehož použití se mi zdá jednodušší a logy přehlednější. Jedinou výhodou mpr je pravděpodobně to, že logy vznikají až později a proto je možné výstup studovat v různých formátech. Výsledky tedtu: Chyby pro použití haldy zapomenuté naalokované bloky paměti najde a zobrazí čísla řádek uvolnění nenaalokovaného bloku vypíše zmatek vícenásobné uvolnění bloku mcheck: memory clobbered before allocated block alokace a realokace bloku o velikosti 0 alokuje i realokuje normálně použití paměti bez testu na selhání malloc Chyby pro použití ukazatelů použití uvolněného bloku pro zápis použití uvolněného bloku pro čtení zápis za koncem pole v zásobníku (buffer owerflow) zápis za koncem alokovaného bloku čtení za koncem alokovaného bloku zápis daleko za koncem alokovaného bloku zápis před koncem alokovaného bloku mcheck: memory clobbered before allocated block čtení před koncem alokovaného bloku čtení neinicalizované paměti Zdrojové kódy najdete na: sunsite.ms.mff.cuni.cz/pub/Linux/devel/lang/c Program podporuje následující platformy: x86-linux, x86-sco (sco3 and sco5), x86-scogds (sco5 with the gnu development system), vax-ultrix výheň