Une version expérimentale de l'outil de débogage dynamique DTrace pour Linux 2.0.0-1.14 a été présentée, mise en œuvre sous la forme d'un processus fonctionnant dans l'espace utilisateur, utilisant la sous-système eBPF et les mécanismes de traçage fournis par le noyau Linux. En termes de fonctionnalité, l'implémentation de DTrace basée sur eBPF est proche de la première implémentation de DTrace pour Linux, réalisée sous la forme d'un module de noyau. Le code du projet est distribué sous la licence GPLv2.
L'outil peut être utilisé avec des noyaux Linux standard prenant en charge BPF. Pour fonctionner, il nécessite la bibliothèque libctf avec l'implémentation de prise en charge du format de débogage CTF (Compact Type Format), qui fait partie du paquet binutils, à partir de la version 2.40, ou la bibliothèque libdtrace-ctf, portée de Solaris. Deux patches optionnels pour le noyau 6.7 sont également proposés, permettant d'activer des fonctionnalités étendues pour obtenir des données supplémentaires sur les modules et le noyau.
La technologie DTrace a été développée pour répondre aux besoins de traçage dynamique du noyau et des applications finales dans le système d'exploitation Solaris. DTrace permet à l'utilisateur de suivre en détail le comportement du système et de diagnostiquer des problèmes en temps réel. Lors du débogage, DTrace n'affecte pas le fonctionnement des applications examinées et n'impacte pas leur performance, ce qui permet de réaliser une analyse des systèmes en fonctionnement. Parmi ses points forts, DTrace se distingue par son langage de haut niveau D, similaire à AWK, qui permet de créer des scripts de traçage beaucoup plus facilement qu'en utilisant les outils proposés pour écrire des gestionnaires eBPF en langages C, Python et Lua avec des bibliothèques externes.
Fonctionnalités principales :
- Fournisseurs disponibles :
- cpc (CPU Performance Counter) — récupération d'informations sur la performance.
- dtrace — gestionnaires BEGIN, END et ERROR, déclenchés avant ou après d'autres vérifications, ainsi qu'en cas d'erreurs.
- fbt (Function Boundary Tracing) — traçage des appels de fonctions du noyau.
- lockstat — suivi de l'état des verrous.
- pid — suivi des appels de fonctions dans les processus fonctionnant dans l'espace utilisateur.
- proc — suivi de l'activité liée aux processus, tels que le démarrage et la terminaison (fork, exec, exit, fault).
- profile — conservation des statistiques de performance à intervalles spécifiés.
- sdt, rawtp — traçage statique du noyau (SDT — Statically Defined Tracing).
- usdt : traçage statique des applications (USDT — Userspace Statically Defined Tracing)
- sched — suivi de la répartition des ressources CPU.
- sycall — suivi des entrées et sorties des appels système.
- Agrégation des données collectées : possibilité d'appliquer des fonctions d'agrégation (avg, count, llquantize, lquantize, max, min, quantize, stddev et sum) et des actions d'agrégation (clear, normalize, normalize, printa). Support de la sauvegarde des résultats des fonctions d'agrégation dans des tableaux ordinaires et associatifs.
- Prise en charge du traçage spéculatif, permettant de suivre éphémèrement les données, en décidant lesquelles conserver dans le tampon de traçage et lesquelles jeter. Fonctions disponibles : speculation, speculate, commit et discard.
- Prise en charge des variables globales et locales, TLS (Thread-Local Storage), des tableaux associatifs et des chaînes.
- Fourniture de variables intégrées : 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.
- Prise en charge des actions : exit, freopen, ftruncate, mod, printa, printf, raise, setopt, stack, sym, system, trace, tracemem, uaddr, umod, ustack et usym.
- Présence de fonctions intégrées : 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.
- Présence de compteurs de données non présentes dans les tampons de traçage.
- Prise en charge de la compilation des scripts de traçage en langage D sous forme de programmes BPF.
- Précompilation des fonctions BPF pour les appels de bibliothèque.
- Option bpflog pour obtenir un journal de vérification des programmes BPF chargés.
- Génération dynamique de code et précompilation de code pour réutilisation dans les programmes BPF.
Modifications dans la nouvelle version :
- Dans le fournisseur pid, utilisé pour suivre les processus en espace utilisateur, prise en charge du suivi de l'exécution des instructions par leur décalage dans le code.
- Ajout du support des fonctions stack() et ustack() pour l'agrégation des données collectées.
- Possibilité de supprimer des éléments de tout type dans les tableaux associatifs en leur assignant la valeur littérale 0.
- Ajout de l'action print pour afficher des données structurées avec des annotations de types.
- Ajout de nouvelles fonctions intégrées cleanpath(), d_path() et link_ntop().
- Ajouté le paramètre « -xcpu », permettant de lier les vérifications à des CPU spécifiques.
- Ajouté le paramètre « -xlockmem » pour limiter la taille de la mémoire.
- Permet de conserver les données de tracé des processus (USDT) entre les redémarrages de dtprobed.
- Prise en charge du mécanisme BTF (BPF Type Format), fournissant des informations pour vérifier les types dans le pseudocode BPF.
- Possibilité d'utiliser le script configure pour la compilation.
Source : opennet.ru
