Início > SO > Strace

Strace

O strace tem a funcionalidade de rastrear as chamadas de sistema (system calls(Uma chamada de sistema é um método usado pelo processo para requisitar um serviço do sistema operacional)) produzidas por um determinado processo.
Conexões TCP/IP e arquivos abertos por um processo são algumas das muitas informações possíveis de se colher durante um rastreamento.

Pagina da documentação do strace é:

# man strace
Agora algumas formas de executar o strace que tenha alguma aplicação em algum ambiente real:

# strace comando
O strace executa o comando especificado e faz o rastreamento de suas chamadas de sistema, mostrando as informações diretamente no terminal ou console.

# strace comando -o arquivo
Mesma situação do comando anterior, contudo, as informações de rastreamento serão enviadas para o arquivo especificado, ao invés do terminal ou console.

# strace -p PID
Faz o rastreamento de um processo em execução com o PID informado.

Agora vou testar o strace com 1 comando(rm) para ver o que traz, segue:

[root@hodb001vtr ~]# strace rm
execve(“/bin/rm”, [“rm”], [/* 31 vars */]) = 0
brk(0) = 0x822c000
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7872000
access(“/etc/ld.so.preload”, R_OK) = -1 ENOENT (No such file or directory)
open(“/etc/ld.so.cache”, O_RDONLY) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=78058, …}) = 0
mmap2(NULL, 78058, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb785e000
close(3) = 0
open(“/lib/libc.so.6”, O_RDONLY) = 3
read(3, “\177ELF\1\1\1\3\3\3\1 \236\244004″…, 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1855584, …}) = 0
mmap2(0xa33000, 1620360, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xa33000
mprotect(0xbb8000, 4096, PROT_NONE) = 0
mmap2(0xbb9000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x185) = 0xbb9000
mmap2(0xbbc000, 10632, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xbbc000
close(3) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb785d000
set_thread_area({entry_number:-1 -> 6, base_addr:0xb785d6c0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
mprotect(0xbb9000, 8192, PROT_READ) = 0
mprotect(0xa2b000, 4096, PROT_READ) = 0
munmap(0xb785e000, 78058) = 0
brk(0) = 0x822c000
brk(0x824d000) = 0x824d000
open(“/usr/lib/locale/locale-archive”, O_RDONLY|O_LARGEFILE) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=99158720, …}) = 0
mmap2(NULL, 2097152, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb765d000
close(3) = 0
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo …}) = 0
open(“/usr/share/locale/locale.alias”, O_RDONLY) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=2512, …}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7871000
read(3, “# Locale name alias data base.\n#”…, 4096) = 2512
read(3, “”, 4096) = 0
close(3) = 0
munmap(0xb7871000, 4096) = 0
open(“/usr/share/locale/en_US.UTF-8/LC_MESSAGES/coreutils.mo”, O_RDONLY) = -1 ENOENT (No such file or directory)
open(“/usr/share/locale/en_US.utf8/LC_MESSAGES/coreutils.mo”, O_RDONLY) = -1 ENOENT (No such file or directory)
open(“/usr/share/locale/en_US/LC_MESSAGES/coreutils.mo”, O_RDONLY) = -1 ENOENT (No such file or directory)
open(“/usr/share/locale/en.UTF-8/LC_MESSAGES/coreutils.mo”, O_RDONLY) = -1 ENOENT (No such file or directory)
open(“/usr/share/locale/en.utf8/LC_MESSAGES/coreutils.mo”, O_RDONLY) = -1 ENOENT (No such file or directory)
open(“/usr/share/locale/en/LC_MESSAGES/coreutils.mo”, O_RDONLY) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=435, …}) = 0
mmap2(NULL, 435, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7871000
close(3) = 0
write(2, “rm: “, 4rm: ) = 4
write(2, “missing operand”, 15missing operand) = 15
write(2, “\n”, 1
) = 1
write(2, “Try `rm –help’ for more informa”…, 38Try `rm –help’ for more information.
) = 38
close(0) = 0
close(1) = 0
close(2) = 0
exit_group(1) = ?
[root@hodb001vtr ~]#

Putzzz tudo isso para deletar, rs, bom o strace é muito bom para debugar mas é necessário um pouco de conhecimento em linguagem C

Achei interessante usar a opção -c, segue:

-c — count time, calls, and errors for each syscall and report summary

Bom vou executa-lo:

[root@hodb001vtr ~]# strace -c du /home/oracle
4 /home/oracle/Templates
4 /home/oracle/.config/gnome-disk-utility/ata-smart-ignore
8 /home/oracle/.config/gnome-disk-utility
4 /home/oracle/.config/gnome-session/saved-session
8 /home/oracle/.config/gnome-session
36 /home/oracle/.config
4 /home/oracle/.gvfs
64 /home/oracle/.gconfd
148 /home/oracle/.local/share/gvfs-metadata
12 /home/oracle/.local/share/applications
164 /home/oracle/.local/share
168 /home/oracle/.local
1492 /home/oracle
% time seconds usecs/call calls errors syscall
—— ———– ———– ——— ——— —————-
46.26 0.025505 152 168 getdents64
43.63 0.024055 78 308 fstatat64
3.91 0.002158 4 598 fcntl64
3.91 0.002157 24 89 openat
1.64 0.000906 5 178 close
0.34 0.000189 2 84 write
0.29 0.000159 2 93 fstat64
0.00 0.000000 0 1 read
0.00 0.000000 0 3 open
0.00 0.000000 0 1 execve
0.00 0.000000 0 1 1 access
0.00 0.000000 0 3 brk
0.00 0.000000 0 2 munmap
0.00 0.000000 0 3 mprotect
0.00 0.000000 0 8 mmap2
0.00 0.000000 0 1 set_thread_area
—— ———– ———– ——— ——— —————-
100.00 0.055129 1541 1 total
[root@hodb001vtr ~]#

Tem algumas informações na saída deste comando, os contadores de cada chamada do sistema (calls) e tempo de processamento (seconds) são úteis quando queremos saber onde esta o gargalo na execução da aplicação.

Bom é isso.
Abraço!

Categorias:SO
  1. Nenhum comentário ainda.
  1. No trackbacks yet.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: