Die experimentelle Version des DTrace-Debugging-Tools für Linux 2.0.0-1.14 wurde eingeführt. Es funktioniert in einem Benutzerraumprozess und nutzt das eBPF-Subsystem sowie die standardmäßigen Tracing-Mechanismen, die vom Linux-Kernel bereitgestellt werden. Funktional entspricht die eBPF-basierte DTrace-Implementierung der ersten DTrace-Implementierung für Linux, die in Form eines Kernel-Moduls realisiert wurde. Der Quellcode des Projekts wird unter der GPLv2-Lizenz verbreitet.
Das Tool kann mit Standard-Linux-Kernen, die BPF unterstützen, verwendet werden. Es benötigt die libctf-Bibliothek zur Unterstützung des Debugging-Formats CTF (Compact Type Format), die im binutils-Paket ab Version 2.40 enthalten ist, oder die von Solaris portierte libdtrace-ctf-Bibliothek. Optional werden zwei Patches für den Kernel 6.7 angeboten, die erweiterte Funktionen zur Sammlung zusätzlicher Daten über Module und den Kernel aktivieren.
Die DTrace-Technologie wurde entwickelt, um Herausforderungen bei der dynamischen Tracing von Kerneln und Endanwendungen im Betriebssystem Solaris zu lösen. DTrace ermöglicht es dem Benutzer, das Verhalten des Systems detailliert zu überwachen und in Echtzeit Diagnosen durchzuführen. Bei der Fehlersuche beeinträchtigt DTrace nicht die Funktionsweise der analysierten Anwendungen und hat keinen Einfluss auf deren Leistung, was eine Analyse laufender Systeme in Echtzeit ermöglicht. Zu den Stärken von DTrace gehört die hochgradige Programmiersprache D, die der Syntax von AWK ähnelt und die die Erstellung von Tracing-Skripten erheblich vereinfacht im Vergleich zu den für eBPF angebotenen Methoden zur Erstellung von Handlern in den Sprachen C, Python und Lua unter Verwendung externer Bibliotheken.
Hauptfunktionen:
- Verfügbare Anbieter:
- cpc (CPU Performance Counter) – Abruf von Leistungsinformationen.
- dtrace – Handler für BEGIN, END und ERROR, die vor oder nach anderen Prüfungen sowie bei Fehlern ausgeführt werden.
- fbt (Function Boundary Tracing) – Überwachung von Funktionsaufrufen im Kernel.
- lockstat – Überwachung des Zustands von Sperren.
- pid – Überwachung von Funktionsaufrufen in Prozessen, die im Benutzerraum laufen.
- proc – Überwachung von aktivitätsbezogenen Vorgängen wie Starten und Beenden (fork, exec, exit, fault).
- profile – Speicherung von Leistungsstatistiken über vorgegebene Zeitintervalle.
- sdt, rawtp – statisches Kernel-Tracing (SDT – Statically Defined Tracing).
- usdt: statisches Anwendungs-Tracing (USDT – Userspace Statically Defined Tracing)
- sched – Überwachung der CPU-Ressourcenzuteilung.
- sycall – Überwachung des Zugriffs auf Systemaufrufe und deren Rückkehr.
- Aggregation der gesammelten Daten: Möglichkeit zur Anwendung von Aggregatfunktionen (avg, count, llquantize, lquantize, max, min, quantize, stddev und sum) und aggregierten Aktionen (clear, normalize, printa). Unterstützung zur Speicherung der Ergebnisse aggregierter Funktionen in normalen und assoziativen Arrays.
- Unterstützung für spekulatives Tracing, das ephemeral die Daten aufzeichnet und entscheidet, welche davon im Tracing-Puffer gespeichert und welche verworfen werden sollen. Verfügbare Funktionen: speculation, speculate, commit und discard.
- Unterstützung für globale und lokale Variablen, TLS (Thread-Local Storage), assoziative Arrays und Strings.
- Bereitstellung integrierter Variablen: 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.
- Unterstützung für Operationen: exit, freopen, ftruncate, mod, printa, printf, raise, setopt, stack, sym, system, trace, tracemem, uaddr, umod, ustack und usym.
- Verfügbarkeit integrierter Funktionen: 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.
- Verfügbarkeit von Zählern für Daten, die nicht in Tracing-Puffer gelangen.
- Unterstützung für die Kompilierung von Tracing-Skripten in der D-Sprache in BPF-Programme.
- Vorkompilierung von BPF-Funktionen für Bibliotheksaufrufe.
- Die bpflog-Option für die Protokollierung der Validierung von geladenen BPF-Programmen.
- Dynamische Code-Generierung und Vorkompilierung von Code für die Wiederverwendung in BPF-Programmen.
Änderungen in der neuen Version:
- Im Anbieter pid, der zur Überwachung von Prozessen im Benutzerraum verwendet wird, wurde die Unterstützung zur Überwachung der Ausführung von Instruktionen basierend auf deren Versatz im Code hinzugefügt.
- Die Unterstützung der Funktionen stack() und ustack() zur Aggregation der gesammelten Daten wurde hinzugefügt.
- Die Möglichkeit, Elemente beliebiger Typen aus assoziativen Arrays durch Zuweisung des Literals 0 zu entfernen.
- Die Druckfunktion zum Ausgeben strukturierter Daten mit Typannotationen wurde hinzugefügt.
- Neue integrierte Funktionen cleanpath(), d_path() und link_ntop() wurden hinzugefügt.
- Der Parameter „-xcpu“ wurde hinzugefügt, um Prüfungen an bestimmten CPUs zu binden.
- Der Parameter „-xlockmem“ wurde hinzugefügt, um die Größe des Speichers zu begrenzen.
- Die Möglichkeit wurde geschaffen, Prozess-Trace-Daten (USDT) zwischen den Starts von dtprobed zu speichern.
- Unterstützung des BTF-Mechanismus (BPF Type Format), der Informationen zur Typüberprüfung in Pseudocode BPF bereitstellt.
- Die Verwendung eines Configure-Skripts zum Bauen ist möglich.
Quelle: opennet.ru
