Foi lançado um release experimental da ferramenta de depuração dinâmica DTrace para Linux 2.0.0-1.14, implementada como um processo em espaço de usuário, utilizando a subsistema eBPF e os mecanismos de rastreamento fornecidos pelo kernel do Linux. Em termos de funcionalidade, a implementação do DTrace baseada em eBPF é semelhante à primeira implementação do DTrace para Linux, realizada na forma de um módulo de kernel. O código do projeto é distribuído sob a licença GPLv2.
A ferramenta pode ser utilizada com kernels Linux padrão que suportam BPF. Para funcionar, é necessária a biblioteca libctf com suporte ao formato de depuração CTF (Compact Type Format), que faz parte do pacote binutils a partir da versão 2.40, ou a biblioteca libdtrace-ctf, portado do Solaris. Dois patches opcionais para o kernel 6.7 são oferecidos, permitindo acessar recursos avançados para obter dados adicionais sobre módulos e o kernel.
A tecnologia DTrace foi desenvolvida para lidar com tarefas de rastreamento dinâmico do kernel e de aplicações finais no sistema operacional Solaris. O DTrace permite aos usuários monitorar detalhadamente o comportamento do sistema e diagnosticar problemas em tempo real. Durante a depuração, o DTrace não influencia a operação das aplicações em teste e não afeta seu desempenho, o que facilita a análise de sistemas em funcionamento. Entre os pontos fortes do DTrace, destaca-se a linguagem de alto nível D, que se assemelha ao AWK, tornando a criação de scripts de rastreamento muito mais simples do que usando as ferramentas de escrita de manipuladores para eBPF em C, Python e Lua com bibliotecas externas.
Principais funcionalidades:
- Provedores disponíveis:
- cpc (Contador de Desempenho da CPU) - obtendo informações de desempenho.
- dtrace - manipuladores BEGIN, END e ERROR, acionados antes ou depois de outras verificações, assim como em caso de erros.
- fbt (Rastreamento de Fronteiras de Função) - rastreamento de chamadas de funções do kernel.
- lockstat - rastreamento do estado das travas.
- pid - rastreamento de chamadas de funções em processos que operam em espaço de usuário.
- proc - rastreamento de atividades relacionadas a processos, como inicialização e término (fork, exec, exit, fault).
- profile - salvando estatísticas de desempenho em intervalos específicos.
- sdt, rawtp — rastreamento de kernel estático (SDT — Statically Defined Tracing).
- usdt: rastreamento de aplicativos estáticos (USDT — Userspace Statically Defined Tracing)
- sched — rastreamento da distribuição de recursos da CPU.
- sycall — rastreamento de chamadas de sistema de entrada e saída.
- Agregação de dados coletados: possibilidade de aplicar funções agregadas (avg, count, llquantize, lquantize, max, min, quantize, stddev e sum) e ações agregadas (clear, normalize, printa). Suporte à salvaguarda dos resultados da aplicação de funções agregadas em arrays normais e associativos.
- Suporte ao rastreamento especulativo, permitindo rastrear dados de forma efêmera, decidindo quais deles devem ser registrados no buffer de rastreamento e quais devem ser descartados. Funções disponíveis: speculation, speculate, commit e discard.
- Suporte a variáveis globais e locais, TLS (Thread-Local Storage), arrays associativos e strings.
- Fornecimento de variáveis embutidas: 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.
- Suporte a ações: exit, freopen, ftruncate, mod, printa, printf, raise, setopt, stack, sym, system, trace, tracemem, uaddr, umod, ustack e usym.
- Disponibilidade de funções embutidas: 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.
- Disponibilidade de contadores de dados que não vão para os buffers de rastreamento.
- Suporte à compilação de scripts de rastreamento na linguagem D na forma de programas BPF.
- Pré-compilação de funções BPF para chamadas de biblioteca.
- Opção bpflog para obter um log de verificação de programas BPF carregados.
- Geração dinâmica de código e pré-compilação de código para reuso em programas BPF.
Mudanças na nova versão:
- No provedor pid, aplicado para rastreamento de processos no espaço do usuário, foi adicionado suporte para rastreamento da execução de instruções por seu deslocamento no código.
- Adicionado suporte ao uso das funções stack() e ustack() para agregar dados coletados.
- Capacidade de remover elementos de qualquer tipo de arrays associativos através da atribuição do literal 0.
- Adicionada a ação print para saída de dados estruturados com anotações de tipos.
- Novas funções embutidas cleanpath(), d_path() e link_ntop() foram adicionadas.
- Adicionado o parâmetro «-xcpu», permitindo vincular as verificações a CPUs específicas.
- Adicionado o parâmetro «-xlockmem» para limitar o tamanho da memória.
- Foi possibilitado o salvamento dos dados de rastreamento de processos (USDT) entre reinicializações do dtprobed.
- Suporte ao mecanismo BTF (BPF Type Format), que fornece informações para verificação de tipos em pseudocódigo BPF.
- Possibilidade de usar o script configure para compilação.
Fonte: opennet.ru
