[Dicas-L] SystemTap - O Dtrace do Linux
SystemTap - O Dtrace do Linux
Até um tempo atrás a depuração do kernel do Linux era basicamente ler o código fonte e inferir o que poderia estar errado. Com o passar doas anos algumas tecnologias de probing evoluiram a ponto de oferecer grandes ferramentas para detalhar como funciona o sistema e facilmente detectar o que pode estar errado durante sua execução.
A ferramenta a ser comentada hoje é o SystemTap. Essa é uma ferramenta muito poderosa que proporciona inúmeros recursos para debug de kernel, e recentemente para debug de aplicações em espaço de usuário também. Algo muito parecido com que o famoso Dtrace faz no Solaris, obviamente, guardando as diferenças de funcionamento.
Uma das motivações da criação do SystemTap foi o desenvolvimento de uma ferramenta que, quando alguém quisesse fazer alguma modificação no kernel, com colocar um printk, não fosse necessário executar a tediosa operação de alterar o kernel, recompilar, reinstalar e as vezes reiniciar o computador, que, além de consumir muito tempo, é muito propenso a erros. Sendo assim, o SystemTap permite fazer probes dinâmicos sem ter que reinistalar o kernel, e sem, até mesmo, compilar o kernel.
O SystemTap é uma ferramenta que utiliza dos tecnologias de probe já existente no kernel, como por exemplo, kprobe, jprobe e kretprobe. Essas tecnologias permitem que você coloque um breakpoint, chamados de probe points, em praticamente qualquer lugar no kernel, e quando esse probe points for executado, ele chama uma função, denominada handler, que executa o código escrito por você. Note o handler normalmente pega algum estado do sistema e imprime, como por exemplo um backtrace, porém também é possível fazer handlers que altera o estado do sistema, e para tanto é necessário usar o SystemTap em modo guru.
A instalação do SystemTap depende do pacote de debuginfo do kernel além do grupo de pacotes de desenvolvimento. Normalmente as grandes distribuições já as dependencias automaticas, e bastanto usar o yum ou apt-get é suficiente para ter o serviço feito. Note que se quiser depurar o código upstream, precisará do SystemTap upstream, uma vez que ambos são diretamente ligados.
Um exemplo bem básico consiste em fazer probe da chamada de sistema que cria um diretório. Toda vez que a chamada for executada, vai ser impresso o nome do diretório a ser criado e o modo de criação usado. Uma vez que a função for executada, será impresso se o retorno da chamada foi sucesso ou não. Segue o código do script:
probe kernel.function("sys_mkdir"){
printf("Creating directory %s using mode %d...", user_string($pathname), $mode)
probe kernel.function("sys_mkdir").return {
printf("created\n")
printf("failed\n")
# stap script.stap
Creating file foo using mode 511...failed
Creating file /tmp/foo using mode 511...created
Creating file /tmp/stapgIfyVs using mode 448...created
Outro exemplo intressante é a mudança de estado de uma determinada variável em tempo real. Para tanto será necessário usar o SystemTap em modo guru. Segue um exemplo de código:
probe kernel.function("sys_write"){
if (isinstr(user_string($buf),"SystemTap")){
$buf = $buf + 0x06 // Shift 6 characters
E uma vez que esse script for executado, toda vez que a palavra SystemTap for impressa, será impresso na tela somente a palavra Tap. Segue um exemplo:
# stap script2.stap -g &
# echo SystemTap
Com base nisso, é possível mostrar o quanto o SystemTap pode ser útil quando se precisa ir mais a fundo no funcionamento do sistema.
Para mais detalhes sobre a linguagem, instalação e funcionamento, consultar o tutorial "SystemTap: Instrumenting the Linux Kernel for Analyzing Performance and Functional Problems"[1] ou a Wiki do projeto[2].
http://www.redbooks.ibm.com/abstracts/redp4469.html
Breno Leitão é um desenvolvedor de kernel pela IBM, e tem participado de várias conferências sobre Linux. Recentemente escreveu um tutorial sobre SystemTap intitulado "SystemTap: Instrumenting the Linux Kernel for Analyzing Performance and Funtcional Problems"