Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Introdução ao SystemTap - João Avelino Bellomo Filho - Tchelinux Caxias 2018

Introdução ao SystemTap - João Avelino Bellomo Filho - Tchelinux Caxias 2018

  • Login to see the comments

  • Be the first to like this

Introdução ao SystemTap - João Avelino Bellomo Filho - Tchelinux Caxias 2018

  1. 1. SystemTap Básico João Avelino Bellomo Filho Tchelinux - 2018
  2. 2. 2/32 Debug no LinuxDebug no Linux ● No espaço do usuário (user space): – strace, ltrace, lsof, systat, etc... ● No espaço do kernel (kernel space): – ps, ftrace, perf, vmstat, ss, etc...
  3. 3. 3/32 Debug no LinuxDebug no Linux
  4. 4. 4/32 Debug no LinuxDebug no Linux ● Para maior precisão: – Acesso aos fontes – Definição de breakpoints – Instrumentação, por meio de inserção de código de debug ● Procedimentos: – No user space: recompilar e executar – No kernel space: recompilar, instalar, reiniciar
  5. 5. 5/32 SystemTapSystemTap É uma ferramenta de monitoramento e investigação das atividades do sistema, principalmente o kernel do Linux.
  6. 6. 6/32 Por que usar?Por que usar? ● Permite acompanhar eventos no kernel space sem a necessidade de inserir código, recompilar, instalar e reiniciar o sistema. ● Possibilita a administradores e desenvolvedores identificar a causa de bugs ou problemas de performance. ● Permite que a investigação e monitoração de grande parte das funções do kernel, chamadas de sistema e outros eventos, possa ser feita por meio de scripts simples.
  7. 7. 7/32 RecursosRecursos ● Monitoração de subsistemas do kernel ● Monitoração de eventos do user space. ● Criação de breakpoints
  8. 8. 8/32 A Linguagem de scriptA Linguagem de script ● Estruturas da linguagem: if(expr) statement else statement while(condition) statement for(expr; expr; expr) statement etc ... ● Declaração de variáveis (de tipos simples ou complexos como strings e arrays); ● Declaração de funções ● Declaração de sondas (probes)
  9. 9. 9/32 Pontos de sondagem – kernel spacePontos de sondagem – kernel space ● probe kernel – kernel.function( "xxx" ) – kernel.statement( "xxx.c:nnn" ) – kernel.function( "xxx" ).return – ... ● probe module – module( "xxx" ).function( "xxx" ) – module( "xxx" ).statement( "xxx.c:nnn" ) – ...
  10. 10. 10/32 Pontos de sondagem – kernel spacePontos de sondagem – kernel space ● Variações: – kernel.function( "xxx" ) – kernel.function( "xxx" ).call – kernel.function( "xxx" ).return – kernel.function( "xxx" ).inline – ...
  11. 11. 11/32 Pontos de sondagem – user spacePontos de sondagem – user space ● probe process – process( "xxx" ).function( "xxx" ) – process( "xxx" ).statement( "xxx.c:nnn" ) – process( "xxx" ).syscall – process( "xxx" ).thread
  12. 12. 12/32 Pontos de sondagem – user spacePontos de sondagem – user space ● Variações – process( "xxx" ).function( "xxx" ).call – process( "xxx" ).function( "xxx" ).return – process( "xxx" ).thread.begin – process( "xxx" ).thread.end – process( "xxx" ).syscall.begin – process( "xxx" ).syscall.end – ...
  13. 13. 13/32 Sondas especiaisSondas especiais ● probe begin ● probe end ● probe error
  14. 14. 14/32 Funções e tapsetsFunções e tapsets ● De contexto: – backtrace(), caller(), cpu(), execname(), etc... ● Exibição de dados: – print(), printk(), etc... ● De Rede: – htol(), format_ipaddr(), etc ... ● Tratamento de strings: – strlen(), strtol(), etc... ● etc...
  15. 15. 15/32 tapsetstapsets ● Biblioteca de sondas e funções ● Systemtap scripts ● Funções definidas no systemtap ● Código fonte em C (entre '%{' e '%}') ● Localizados no diretório: /usr/share/systemtap/tapset
  16. 16. 16/32 Exemplos de tapsetExemplos de tapset ... function substr:string( str:string, start:long, length:long) %{ /* pure */ /* unprivileged */ int64_t length = clamp_t( int64_t, STAP_ARG_length + 1, 0, MAXSTRINGLEN); if (STAP_ARG_start >= 0 && STAP_ARG_start < strlen(STAP_ARG_str)) strlcpy(STAP_RETVALUE, STAP_ARG_str + STAP_ARG_start, length); %} ... /usr/share/systemtap/tapset/string.stp
  17. 17. 17/32 Código C - propriedadesCódigo C - propriedades pure O código C não possui efeitos colaterais e pode ser eliminado se o valor não for usado no script. unprivileged É seguro de ser usado por usuários não privilegiados. myproc-unprivileged É seguro de ser usado por usuários não privilegiados, desde que o alvo seja parte de um processo do próprio usuário. guru O código C é tão inseguro que deve ser usado a opção '-g' para usá-lo sempre que esse tapset for usado. unmangled Utiliza elementos legados de versões anteriores ao SystemTap 1.8, usado na migração de código. string Usada apenas em expressões no código fonte, significa que a expressão é do tipo 'const char *' e deve ser tratado como string não como um 'lonf int'.
  18. 18. 18/32 Exemplos de tapsetExemplos de tapset ... probe netdev.receive = kernel.function("netif_receive_skb") { dev_name = kernel_string($skb->dev->name) length = $skb->len protocol = $skb->protocol truesize = $skb->truesize } ... /usr/share/systemtap/tapset/linux/networking.stp
  19. 19. 19/32 FuncionamentoFuncionamento Análise script.stpscript.stp tapsettapset debuginfodebuginfo script.tmp.cscript.tmp.c Compilação script.koscript.ko Execuçãosystetamp- runtime systetamp- runtime
  20. 20. 20/32 InstalaçãoInstalação ● Por exemplo, no Fedora 28: – Instalação: dnf -y install systemtap systemtap-runtime dnf config-manager --set-enabled fedora-debuginfo dnf -y install --enablerepo=* kernel-debuginfo-$(uname -r)$(uname -r) kernel-devel-$(uname -r)$(uname -r) – Teste: stap -v -e 'probe vfs.read {printf("read performedn"); exit()}'
  21. 21. 21/32 O testeO teste # stap -v -e 'probe vfs.read {printf( ... Pass 1: parsed user script and 111 library script(s) using 218600virt/41708res/6584shr/35640data kb, in 110usr/10sys/120real ms. Pass 2: analyzed script: 1 probe(s), 1 function(s), 4 embed(s), 0 global(s) using 369528virt/187996res/8072shr/186568data kb, in 1310usr/210sys/1531real ms. Pass 3: using cached /root/.systemtap/cache/e2/stap_e27fde8...5_1624.c Pass 4: using cached /root/.systemtap/cache/e2/stap_e27fde8...5_1624.ko Pass 5: starting run. read performedread performed Pass 5: run completed in 0usr/20sys/331real ms.
  22. 22. 22/32 Listando sondas (probes)Listando sondas (probes) ● Verificando se existe: # stap -l 'kernel.function("run_cmd")' ● Visualizando os argumentos e variáveis locais: # stap -L 'kernel.function("run_cmd")' ● Procurando de acordo com um padrão: # stap -l 'kernel.function("SYSC*")' ... kernel.function("run_cmd@kernel/reboot.c:392") kernel.function("run_cmd@kernel/reboot.c:392") $cmd:char const* $envp:char*[]
  23. 23. 23/32 Exemplos de Scripts
  24. 24. 24/32 begin-end.stpbegin-end.stp probe begin { printf( "nnnIniciando instrumentação ...nn" ); println( "Pressione Ctrl+C para encerrar."); } probe end { println( "Encerrando instrumentação." ); }
  25. 25. 25/32 begin-end-timer.stpbegin-end-timer.stp probe begin { printf( "nnnIniciando instrumentação ...nn" ); println( "Encerra em 5 segundos." ); } probe timer.s(5) { exit(); } probe end { println( "Encerrando instrumentação." ); }
  26. 26. 26/32 begin-end-contador.stpbegin-end-contador.stp global contador=0; probe begin { printf( "nnnIniciando instrumentação ...nn" ); println( "Encerra em 5 segundos." ); } probe timer.s(1) { contador++; println( contador ); } probe timer.s(5) { exit(); } probe end { println( "Encerrando instrumentação." ); }
  27. 27. 27/32 ls-functions.stpls-functions.stp probe begin { println( "Monitorando o comando ls ..." ); } probe process("ls").function("*") { println( ppfunc() ); } probe end { println( "Encerrando monitoramento." ); }
  28. 28. 28/32 ls-syscall.stpls-syscall.stp probe begin { printf( "Monitorando os comandos ls ..." ); } probe syscall.* { if( execname() == "ls" ) printf( "%d %sn", pid(), name ); } probe end { println( "Encerrando monitoramento." ); }
  29. 29. 29/32 e1000-module.stpe1000-module.stp probe begin { printf( "nnMonitorando modulo e1000 ...nn" ); } probe module("e1000").function("*") { printf( "%sn", ppfunc() ); } probe end { println( "Encerrando monitoramento." ); }
  30. 30. 30/32 e1000-module-all.stpe1000-module-all.stp probe begin { printf( "nnMonitorando modulo e1000 ...nn" ); } probe module("e1000").function("*").call { printf( "[%s] ENTER (%s)n", ppfunc(), $$parms$$ ); } probe module("e1000").function("*").return { printf( "[%s] RETURN (%s)n", ppfunc(), $$return$$ ); } probe end { println( "Encerrando monitoramento." ); }
  31. 31. 31/32 Outros ExemplosOutros Exemplos https://sourceware.org/systemtap/examples/ ● process/strace.stp ● network/netfilter_summary.stp ● process/proctop.stp ● etc ...
  32. 32. 32/32 ReferencesReferences ● http://www.brendangregg.com/linuxperf.html ● https://www.centos.org/docs/5/html/Deployment_Guide-en -US/s2-systemtap-implementation.html ● https://sourceware.org/systemtap/ ● https://sourceware.org/systemtap/wiki/SystemtapOnFedor a ● https://www.sourceware.org/systemtap/wiki/ ● https://sourceware.org/systemtap/wiki/HomePage ● http://www.redhat.com/magazine/011sep05/features/syste mtap ● https://fedoraproject.org/wiki/Building_a_custom_kernel

×