glibc: Verzió 2.1
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.
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.
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).
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"
.
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.
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.
SDB-aj_debug
)