Bemutatásra került a DTrace dinamikus hibakeresési eszköz Linux 2.0.0-1.14-es verziójához készült kísérleti kiadása, amely felhasználói térben futó folyamat formájában valósul meg, az eBPF alrendszert és a Linux kernel által biztosított nyomozási mechanizmusokat felhasználva. A funkcionálisan az eBPF alapú DTrace megvalósítása közel áll az első, Linux számára készült DTrace megvalósításhoz, amely kernel modul formájában készült. A projekt kódja GPLv2 licenc alatt terjesztendő.
Az eszköz használható a BPF-t támogató alapértelmezett Linux kernel verziókkal. A működéshez szükséges a libctf könyvtár, amely támogatja a CTF (Compact Type Format) hibakeresési formátumot, és amely a binutils csomag része a 2.40-es verziótól kezdve, vagy a Solarisból portolt libdtrace-ctf könyvtár. Opcionálisan két javítócsomag érhető el a 6.7-es kernelhez, amelyek lehetővé teszik kiterjesztett képességek használatát további modul és kernel adatgyűjtéséhez.
A DTrace technológiát a kernel és a végső alkalmazások dinamikus nyomozási feladataira fejlesztették ki a Solaris operációs rendszerben. A DTrace lehetőséget ad a felhasználónak, hogy részletesen nyomon kövesse a rendszer működését, és valós időben diagnosztizálja a problémákat. A hibakeresés során a DTrace nem befolyásolja a vizsgált alkalmazások működését, és egyáltalán nem hat a teljesítményükre, ami lehetővé teszi a működő rendszerek elemzését menet közben. A DTrace erősségei között emeljük ki a D nyelvet, amely hasonlít az AWK-ra, és amelyen jelentősen egyszerűbben készíthetők nyomozási szkriptek, mint az eBPF eszközeivel, amelyek C, Python és Lua nyelveken írt feldolgozókkal külső könyvtárakat igényelnek.
Főbb funkciók:
- Elérhető szolgáltatók:
- cpc (CPU Performance Counter) — a teljesítményinformációk megszerzése.
- dtrace — a BEGIN, END és ERROR kezelők, amelyek más ellenőrzések előtt vagy után, valamint hibák esetén kerülnek végrehajtásra.
- fbt (Function Boundary Tracing) — a kernel függvényhívásainak nyomkövetése.
- lockstat — a zárak állapotának nyomozása.
- pid — hívások nyomozása felhasználói térben futó folyamatokban.
- proc — folyamatspecifikus aktivitások nyomozása, mint például a folyamatok indítása és leállítása (fork, exec, exit, fault).
- profile — a teljesítménystatisztikák rögzítése meghatározott időközönként.
- sdt, rawtp — statikus magkernj tracesz (SDT — Statically Defined Tracing).
- usdt: statikus alkalmazás-tracing (USDT — Userspace Statically Defined Tracing)
- sched — CPU erőforrások elosztásának nyomkövetése.
- sycall — rendszervcalls-ba való belépések és kilépések nyomkövetése.
- Gyűjtött adatok aggregálása: lehetőség aggregáló funkciók (avg, count, llquantize, lquantize, max, min, quantize, stddev és sum) és aggregáló műveletek (clear, normalize, printa) alkalmazására. Az aggregáló funkciók eredményeinek megszorítása normál és asszociatív tömbökben támogatott.
- Speculativ nyomkövetés támogatása, amely lehetővé teszi az adatok átmeneti nyomkövetését, döntve arról, hogy mely adatokat rögzítsen a nyomkövető pufferben és melyeket dobjon el. Elérhetők a következő funkciók: speculation, speculate, commit és discard.
- Globális és helyi változók, TLS (Thread-Local Storage), asszociatív tömbök és karakterláncok támogatása.
- Beépített változók biztosítása: arg0 — arg9, args[], caller, curcpu, curthread, epid, errno, execname, gid, id, pid, ppid, probefunc, probemod, probename, probeprov, stackdepth, tid, timestamp, ucaller, uid, uregs[], ustackdepth, walltimestamp.
- Következő műveletek támogatása: exit, freopen, ftruncate, mod, printa, printf, raise, setopt, stack, sym, system, trace, tracemem, uaddr, umod, ustack és usym.
- Beépített funkciók megléte: alloca, basename, bcopy, copyin, copyinstr, copyinto, copyout, copyoutstr, dirname, getmajor, getminor, htonl, htonll, htons, index, inet_ntoa, lltostr, mutex_owned, mutex_owner, mutex_type_adaptive, mutex_type_spin, ntohl, ntohll, ntohs, progenyof, rand, rindex, rw_iswriter, rw_read_held, rw_write_held, strchr, strjoin, strlen, strrchr, strstr, strtok, substr.
- Nyomkovetett pufferbe nem kerülő adatszámlálók megléte.
- Követési szkriptek D nyelven történő Fordításának támogatása BPF-programokká.
- BPF függvények előkompilálása könyvtári hívásokhoz.
- bpflog lehetőség a betöltött BPF-programok ellenőrzési naplójának rögzítéséhez.
- Dinamikus kódgenerálás és kód előkompilálás a BPF-programok újrafelhasználásához.
Újdonságok az új verzióban:
- A pid szolgáltatóba, amelyet a felhasználói tér folyamatainak nyomkövetésére használnak, hozzá lett adva az utasítások nyomkövetésének támogatása a kódon belüli eltolásuk alapján.
- A stack() és ustack() függvények alkalmazásának támogatása a gyűjtött adatok aggregálásához.
- Az asszociatív tömbök elemeinek bármilyen típusú eltávolításának lehetősége 0 literál hozzárendelésével.
- A strukturált adatok típusannotációval való kinyomtatásához hozzáadva a print művelet.
- Új beépített funkciók: cleanpath(), d_path() és link_ntop() hozzáadva.
- Hozzáadva egy „-xcpu” paraméter, amely lehetővé teszi a vizsgálatok bizonyos CPU-khoz való kötését.
- Hozzáadva egy „-xlockmem” paraméter a memória méretének korlátozására.
- Biztosított a folyamatok (USDT) nyomkövetési adatai közötti mentés lehetősége a dtprobed újraindításai között.
- Támogatás a BTF (BPF Type Format) mechanizmushoz, amely információt nyújt a típusok ellenőrzéséhez a BPF pszeudokódban.
- Lehetőség egy configure szkript használatára a buildeléshez.
Forrás: opennet.ru
