Hibakeresés a Glibc-vel

Terméktámogatási adatbázis (aj_debug)
Következőkre vonatkozik

glibc: Verzió 2.1

Az alkalmazások futásának nyomon követése és hibakeresés a glibc-vel

Ez a cikk ismerteti a GNU C programozási könyvtár (glibc 2.1 - 2.1-es vagy újabb verzió) lehetőségeit. Ezek nagyon hasznosak az alkalmazások vagy programkönyvtárak nyomon követésénél. Az nyomkövető programokon (debugger - pl. gdb) és az ún. trace segédprogramok (mint az strace és ltrace) használatán kívül ezáltal további lehetőségek érhetők el.

A glibc kézikönyvében ezek a területek dokumentálva vannak. Minden esetre néhány referencia a kézikönyvben redundáns információkat idézhet elő. Minden egyéb esetben ez a cikk az egyetlen elfogadható információforrás.

A glibc nyomkövetési lehetőségei:

A memóriafoglalással (Malloc) összefüggő problémák nyomon követése

A glibc malloc implementációja kevésbé robusztus az egyéb malloc implementációkhoz képest, ezért időnként előfordulhatnak hibás hívások. Másrészről értékes tulajdonságokkal rendelkezik a szálak biztonságának terén, sebességben és a kisebb memóriakövetelményben. Például, a szegmentációs hibák előléphetnek akkor is, ha egy mutató által lefoglalt memória egynél többször kerül felszabadításra a free függvény által, vagy ha a lefoglalt hely egyetlen bájttal is túl van töltve. Éppen ezért ez a lehetőség fennáll a hibakeresésnél is.

Csak a tisztázás kedvéért: a szegmentációs hiba az alábbi memóriafoglaló rutinok egyikéből származik: __free vagy chunk_alloc és minden esetben azok rossz felhasználása által. Éppen ezért nem minden esetben nyilvánvaló a hiba a malloc függvényekben, inkább (a legtöbb esetben ;-)) a programban van a hiba.

A szegmentálási hibákon túl a glibc számos eszközt tartalmaz a memóriafoglalással kapcsolatos problémák nyomkövetésében. Mindenesetre a legtöbb eszköz ezek közül a program újrafordítását igényli.

Konzisztencia ellenőrzések

A MALLOC_CHECK_ környezeti változó beállításával (az utolsó aláhúzásjel nagyon fontos és nem hagyható el), lehetősége van a malloc, realloc és a free hibakeresésére. Ha a MALLOC_CHECK_ már be van állítva, egy speciális (de kevésbé hatékony) implementációja kerül felhasználásra az előbbi függvényeknek. Ez lehetővé teszi az egyszerűbb hibák felismerését, úgymint a free ismételt meghívását azonos paraméterrel, vagy az egybájtos túlfutást ("off-by-one" hibák). Mindenesetre ez a módszer nem nyújt garantált védelmet a hibák ellen, és memória rések keletkezhetnek általa.

Ha a MALLOC_CHECK_ értéke 0, minden felismert heap hiba figyelmen kívül marad, regisztrálás nélkül. Ha a változó értéke 1, az üzenetek kiíródnak az stderr-re. Ha értéke, az abort függvény azonnali végrehajtásra kerül. Ez nagyon hasznos lehet, mivel a többszöri rendszerfagyás gyakran nehezíti az ilyen fajta hibák nyomon követését.

További lehetőség a speciális memória ellenőrzések fordítása a programba. A részletek miatt olvassa el a glibc kézikönyvét (amelyek a info libc "Heap Consistency Checking" fejezetben találhatók).

Memóriahézagok keresése

A memóriahézagok keresése (ti. a lefoglalt és nem felszabadított memória) manuálisan eléggé nehézkes, mivel le kell ellenőrizni az összes malloc és free hívásokat (az indirekt hívásokon kívül). A Glibc tartalmaz erre egy eszközt mtrace néven, amely az automatikus keresést is lehetővé teszi. Az eszköz részletes ismertetése megtalálható a glibc kézikönyvében. Gyors segítségül adja ki a következő parancsot: info libc "Allocation Debugging".

A verem nyomon követése

Ha a program futása szegmentációs hibával áll le, egy verem nyomkövetést végezhet a catchsegv paranccsal. Egyszerűen adja meg a catchsegv program paramétereként a hibás program nevét: pl., catchsegv buggy.

Az <execinfo.h> program backtrace funkciója használható a verem ellenőrzésére a saját programokban.

Problémák a dinamikus programkönyvtárakkal

A dinamikusan összefűzött programok esetében a dinamikus linker többféle hibaüzenetet képes kiírni. A kiírandó üzenetek beállíthatók az LD_DEBUG környezeti változóban. Az opciók listája kiíratható, ha az LD_DEBUG értéke help. Például az LD_DEBUG=help ls kimenete (magyar fordításban :-)):
Az LD_DEBUG környezeti változó értékei a következők lehetnek:

  bindings  a szimbólumkapcsolatok megjelenítése
  files     a fájlműveletek és a programkönyvtárak megjelenítése
  help      a súgó megjelenítése és kilépés
  libs      a programkönyvtárak keresési útvonalának megjelenítése
  reloc     az áthelyezési művelet megjelenítése
  symbols   a szimbólumtáblán végzett műveletek megjelenítése
  versions  a verzió függőségek megjelenítése

Hogy átirányíthassa a kimenetet egy fájlba az alapértelmezett kimenet helyett, 
egy kimeneti fájl nevét adhatja meg az LD_DEBUG_OUTPUT környezeti változóban.
Ha egynél több paramétert kíván használni, válassza el őket vesszőkkel, pl. LD_DEBUG=files,libs program.

Az ldd program kiírja egy program vagy programkönyvtár által igényelt összes többi programkönyvtár listáját.


Kulcsszavak: DEBUGGING, MALLOC, GLIBC, HIBA, HIBAKERESéS

Kategóriák:

Visszajelzés: Send Mail to aj@suse.de (Adja meg a levél tárgyát:: SDB-aj_debug)
SDB-aj_debug, Copyright SuSE Linux AG, Nürnberg, Germany
SuSE Linux AG - Utoljára frissítve: 30. Nov 1999 feladó: aj (sdb_gen 1.40.0)