Wprowadzono eksperymentalną wersję zestawu narzędzi do dynamicznego debugowania DTrace Linux 2.0.0-1.14, zaimplementowano jako proces przestrzeni użytkownika przy użyciu podsystemu eBPF i standardowych mechanizmów śledzenia dostarczanych przez jądro LinuxPod względem funkcjonalności implementacja DTrace oparta na eBPF jest bliska pierwszej implementacji DTrace dla Linux, zaimplementowany jako moduł jądra. Kod projektu jest rozpowszechniany na licencji GPLv2.
Zestaw narzędzi można używać ze standardowymi jądrami Linux, obsługując BPF. Wymaga to biblioteki libctf, która implementuje obsługę formatu debugowania CTF (Compact Type Format), zawartego w pakiecie binutils od wersji 2.40, lub biblioteki libdtrace-ctf, przeniesionej z systemu Solaris. Opcjonalnie dostępne są dwie poprawki dla jądra 6.7, które umożliwiają zaawansowane uzyskiwanie dodatkowych danych o modułach i jądrze.
Technologia DTrace została opracowana w celu rozwiązania problemów dynamicznego śledzenia jądra i aplikacji końcowych w systemie operacyjnym Solaris. DTrace daje użytkownikowi możliwość szczegółowego monitorowania zachowania systemu i diagnozowania problemów w czasie rzeczywistym. Podczas procesu debugowania DTrace nie wpływa na działanie badanych aplikacji i w żaden sposób nie wpływa na ich wydajność, co pozwala na organizowanie analizy działających systemów na bieżąco. Jedną z mocnych stron DTrace jest wysoki poziom języka D, podobny do AWK, w którym znacznie łatwiej jest tworzyć skrypty śledzące niż korzystać z narzędzi oferowanych do pisania handlerów eBPF w C, Python i Lua z zewnętrznymi bibliotekami.
Najważniejsze cechy:
- Dostępni dostawcy:
- cpc (CPU Performacne Counter) - uzyskiwanie informacji o wydajności.
- dtrace — procedury obsługi BEGIN, END i ERROR są uruchamiane przed lub po innych kontrolach, a także w przypadku wystąpienia błędów.
- fbt (Function Boundary Tracing) - śledzenie wywołań funkcji jądra.
- lockstat - śledzenie stanu zamków.
- pid — śledzi wywołania funkcji w procesach działających w przestrzeni użytkownika.
- proc - monitoruje aktywność związaną z procesem, taką jak uruchamianie i zamykanie (fork, exec, wyjście, błąd).
- profil - zapisywanie statystyk wydajności w określonych odstępach czasu.
- sdt, rawtp - statyczne śledzenie jądra (SDT - Staticically Defined Tracing).
- usdt: statyczne śledzenie aplikacji (USDT – śledzenie statycznie zdefiniowane przestrzeni użytkownika)
- sched - monitoruje alokację zasobów procesora.
- sycall — śledzi wejście i wyjście wywołań systemowych.
- Agregacja zebranych danych: możliwość wykorzystania funkcji agregujących (avg, count, llquantize, lquantize, max, min, quantize, stddev i suma) oraz akcji agregujących (clear, normalize, normalize, printa). Wsparcie przechowywania wyników stosowania funkcji agregujących w tablicach regularnych i asocjacyjnych.
- Wsparcie dla śledzenia spekulatywnego, które pozwala na efemeryczne monitorowanie danych, decydowanie, które z nich powinny zostać przechwycone w buforze śledzenia, a które odrzucone. Dostępne funkcje to spekulacja, spekulacja, zatwierdzanie i odrzucanie.
- Obsługa zmiennych globalnych i lokalnych, TLS (Thread-Local Storage), tablice asocjacyjne i ciągi znaków.
- Udostępnianie wbudowanych zmiennych: arg0 - arg9, args[], caller, curcpu, curthread, epid, errno, execname, gid, id, pid, ppid,probefunc,probendmod,probataname,proberprov,stackgłębi, tid,timestamp,ucaller, uid, uregs [], ustack głębokość, znacznik czasu ściany.
- Obsługiwane akcje: exit, freopen, ftruncate, mod, printa, printf, raise, setopt, stos, sym, system, trace, tracemem, uaddr, umod, ustack i usym.
- Dostępność wbudowanych funkcji: alloca, basename, bcopy, copyin, copyinstr, copyinto, copyout, copyoutstr, dirname, getmajor, getminor, htonl, htonll, htons, indeks, 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.
- Obecność liczników danych, które nie są uwzględnione w buforach śledzenia.
- Wsparcie dla kompilacji skryptów śledzenia D do postaci programu BPF.
- Prekompilacja funkcji BPF dla wywołań bibliotek.
- Opcja bpflog, aby uzyskać dziennik weryfikacji załadowanych programów BPF.
- Dynamiczne generowanie kodu i prekompilacja kodu do ponownego wykorzystania w programach BPF.
Zmiany w nowej wersji:
- Dostawca pid, służący do śledzenia procesów w przestrzeni użytkownika, dodał obsługę śledzenia wykonania instrukcji według ich przesunięcia w kodzie.
- Dodano obsługę funkcji stack() i ustack() do agregowania zebranych danych.
- Możliwość usuwania elementów dowolnego typu z tablic asocjacyjnych poprzez przypisanie literału 0.
- Dodano akcję drukowania do wyprowadzania danych strukturalnych z adnotacjami typu.
- Dodano nowe wbudowane funkcje cleanpath(), d_path() i link_ntop().
- Dodano parametr „-xcpu”, który umożliwia powiązanie kontroli z określonymi procesorami.
- Dodano opcję „-xlockmem”, aby ograniczyć rozmiar pamięci.
- Zapewniono możliwość zapisywania danych śledzenia procesu (USDT) pomiędzy ponownymi uruchomieniami dtprobed.
- Obsługa mechanizmu BTF (BPF Type Format), który dostarcza informacji o sprawdzaniu typu w pseudokodzie BPF.
- Możliwość wykorzystania skryptu konfiguracyjnego do kompilacji.
Źródło: opennet.ru
