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ň