Strace


strace
Strace
Autor Paul Kranenburg
Desenvolvedor Dmitry Levin
Plataforma AArch64, DEC Alpha, ARC, ARM EABI/OABI, AVR32, Blackfin, HP PA-RISC, IA-32, IA-64, Motorola 68000, Imagination META, MicroBlaze, MIPS, Nios II, OpenRISC, POWER 32/64 bit, RISC-V, z/Architecture 31/64 bit, SuperH 32/64 bit, SPARC 32/64 bit, TILE, TILEPro, TILE-Gx, x86-64, x32 ABI, Xtensa
Versão estável 6.7[1] (29 de janeiro de 2024; há 9 meses)
Idioma(s) Inglês
Escrito em C
Sistema operacional Linux
Gênero(s) Depuração
Licença BSD
Página oficial strace.io

strace é um utilitário de diagnóstico, depuração e de instrução do espaço de usuário para Linux. Ele é usado para monitorar e interferir com interações entre processos e o núcleo do Linux, que incluem chamadas do sistema, entregas de sinais e mudanças no estado do processo. A operação do strace é possibilitada pelo recurso do núcleo conhecido como ptrace.

Alguns sistemas do tipo Unix fornecem outras ferramentas de diagnóstico semelhantes à strace, como truss.

Uso e características

[editar | editar código-fonte]

O uso mais comum é iniciar um programa usando strace, que imprime uma lista de chamadas do sistema feitas pelo programa. Isso é útil se o programa falhar continuamente ou não se comportar como esperado. Por exemplo, usando o strace pode revelar que o programa está tentando acessar um arquivo que não existe ou não pode ser lido.

Uma aplicação alternativa é usar o sinalizador -p para anexar a um processo em execução. Isso é útil se um processo parou de responder e pode revelar, por exemplo, que o processo está bloqueando ao tentar estabelecer uma conexão de rede.

Entre outros recursos, o strace permite o seguinte:

  • Especificar um filtro de nomes syscall que devem ser rastreados (via a opção -e trace =): por nome, como clone, fork, vfork; usando um dos grupos predefinidos, como %ipc ou %file; ou (desde o strace 4.17) usando a sintaxe de expressão regular, como clock_*.
  • Especificar uma lista de caminhos a serem rastreados (-P /etc/ld.so.cache, por exemplo).
  • Especificar uma lista de descritores de arquivos cuja E/S deve ser despejada (opções -e read= e -e write=).
  • Contar o tempo de execução e a contagem do syscall (opções -T, -c, -C e -w).
  • Imprimir marcas de tempo (data) relativas ou absolutas (opções -t e -r).
  • Modificar o código de retorno e de erro dos syscalls especificados e injetar sinais em sua execução (desde o strace 4.15, a opção -e injection=).
  • Extrair informações sobre descritores de arquivos (incluindo sockets, opção -y).
  • Imprimir rastreamentos de pilha, incluindo (desde o strace 4.21) símbolo de desmanche (opção -k).

O strace suporta a decodificação de argumentos de algumas classes de comandos ioctl, como BTRFS_*, V4L2_*, DM_*, NSFS_*, MEM*, EVIO*, KVM_* e vários outros.

Como o strace apenas detalha as chamadas do sistema, ele não pode ser usado para detectar tantos problemas quanto um depurador de código como o GNU Debugger (gdb). Ele é, no entanto, mais fácil de usar do que um depurador de código e é uma ferramenta extremamente útil para administradores de sistema. Ele também é usado por pesquisadores para gerar rastreamentos de chamadas do sistema para posterior replay de chamada do sistema.[2][3][4]

Este é um exemplo de saída típica do comando strace:

open(".", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 3
fstat64(3, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
fcntl64(3, F_GETFD)                     = 0x1 (flags FD_CLOEXEC)
getdents64(3, /* 18 entries */, 4096)   = 496
getdents64(3, /* 0 entries */, 4096)    = 0
close(3)                                = 0
fstat64(1, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f2c000
write(1, "autofs\nbackups\ncache\nflexlm\ngames"..., 86autofsA

O fragmento acima é apenas uma pequena parte da saída do strace quando executado no comando 'ls'. Ele mostra que o diretório de trabalho atual é aberto, inspecionado e seu conteúdo é recuperado. A lista resultante de nomes de arquivos é gravada na saída padrão.

Referências

  1. «Release 6.7» (Lista de grupo de correio). 29 de janeiro de 2024. Consultado em 1 de março de 2024 
  2. Horky, Jiri (2013). «The ioapps IO profiler and IO traces replayer». Consultado em 16 de setembro de 2013 
  3. Waterland, Amos (2007). «The sreplay system call replayer». Consultado em 16 de setembro de 2013 
  4. Burton, Ariel (1998). «Workload characterization using lightweight system call tracing and reexecution» (PDF). Consultado em 16 de setembro de 2013 

Ligações externas

[editar | editar código-fonte]