utrace
Roland Dreier está trabalhando em uma nova infra-estrutura modular para debug e tracing de processos chamada utrace.
Eu havia visto o e-mail de anúncio, mas não dei importância. Semanas depois estava lendo alguns posts no blog do David Miller quando me deperei com isto:
“[...] Way back when I first read up on Plan 9 I thought the coolest thing was that programs didn’t crash, they just froze when they got a segfault or something and waited for someone to come around and debug them. I thought this was brilliant! Roland’s sample module implements this, you just pass in the pid you’re interested in and that pid’s process group will get the Plan 9 semantics.”
Fiquei curioso, fui atrás, e aqui está o resultado.
Resumindo: o ptrace foi substituido pelo utrace, o qual exporta uma interface para tracing e debug de processos. Essa interface é usada por tracing engines, que são módulos do kernel que você escreve.
O objetivo de uma tracing engine é implementar novas funcionalidades de tracing e debug. O próprio suporte a ptrace() foi movido para uma tracing engine (mas somente como built-in, por causa da chamada de sistema).
Um outro (e mais interessante) exemplo de tracing engine é o módulo crash-suspend que o Dave fala na citação acima. O módulo é carregado passando-se o PID de um processo como argumento. Esse processo não morre quando recebe um sinal cuja a ação padrão é morrer e gerar o arquivo de core (eg, SIGSEGV). Ao invés disso ele entra automaticamente no estado TASK_TRACED, isto é, ele é suspenso.
Nesse momento você pode ‘dar um attach’ com o gdb (ou o debugger que preferir), e ‘debuggar’ o processo normalmente.
Se você enviar um SIGCONT o processo volta ao comportamento padrão: morre e gera o core-dump.
Carreguei o crash-suspend com o PID do bash que eu rodo o X, então todos os processos que eu inicio pelo X já tem a semântica que o crash-suspend implementa (uma sessão de exemplo você encontra aqui).
Mas o crash-suspend é apenas um exemplo, a interface do utrace permite muito mais. Você pode ter uma visão geral das possibilidades lendo o arquivo Documentation/utrace.txt.
Patches que aplicam na árvore atual do Linus estão aqui, e também há um repositório GIT em git://git.fedora.redhat.com/git/kernel/roland.git/ (que parece ser onde o desenvolvimento acontece).
Note, no entanto, que o projeto ainda está em desenvolvimento. Estou tendo OOPS quando habilito preempção no kernel (o que provavelmente significa que não funciona em máquinas SMP) e quando faço rmmod em qualquer módulo usando a interface.
Mas mesmo assim é um projeto fascinante, vale a pena testar.