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ň