Como o 'strace' funciona?

2

Recentemente, eu estava usando mv para mover uma grande quantidade de arquivos do meu disco rígido para uma unidade flash. Esqueci de adicionar uma sinalização detalhada, então não tinha ideia de "onde" a movimentação estava e quantas transferências restavam.

Eu encontrei o utilitário strace e decidi usá-lo no meu processo de mv. Usando ps -ef | grep mv , consegui encontrar o pid do processo e, em seguida, executei strace -p [PID] . Aqui está uma amostra do que recebi:

write(4, "5
fcntl(3, F_GETFD)                       = 0
fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
fstat(3, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
fcntl(3, F_GETFL)                       = 0x38800 (flags O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_NOFOLLOW)
fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
fcntl(3, F_DUPFD, 3)                    = 4
fcntl(4, F_GETFD)                       = 0
fcntl(4, F_SETFD, FD_CLOEXEC)           = 0
getdents64(3, /* 4 entries */, 32768)   = 120
getdents64(3, /* 0 entries */, 32768)   = 0
close(3)                                = 0
newfstatat(4, "The Pick of Destiny", {st_mode=S_IFDIR|0755, st_size=4096, ...}, AT_SYMLINK_NOFOLLOW) = 0
openat(4, "The Pick of Destiny", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_DIRECTORY|O_NOFOLLOW) = 3
fcntl(3, F_GETFD)                       = 0
fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
fstat(3, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
fcntl(3, F_GETFL)                       = 0x38800 (flags O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_NOFOLLOW)
fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
fcntl(3, F_DUPFD, 3)                    = 5
fcntl(5, F_GETFD)                       = 0
fcntl(5, F_SETFD, FD_CLOEXEC)           = 0
getdents64(3, /* 22 entries */, 32768)  = 1008
getdents64(3, /* 0 entries */, 32768)   = 0
close(3)                                = 0
write(4, "5
fcntl(3, F_GETFD)                       = 0
fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
fstat(3, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
fcntl(3, F_GETFL)                       = 0x38800 (flags O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_NOFOLLOW)
fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
fcntl(3, F_DUPFD, 3)                    = 4
fcntl(4, F_GETFD)                       = 0
fcntl(4, F_SETFD, FD_CLOEXEC)           = 0
getdents64(3, /* 4 entries */, 32768)   = 120
getdents64(3, /* 0 entries */, 32768)   = 0
close(3)                                = 0
newfstatat(4, "The Pick of Destiny", {st_mode=S_IFDIR|0755, st_size=4096, ...}, AT_SYMLINK_NOFOLLOW) = 0
openat(4, "The Pick of Destiny", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_DIRECTORY|O_NOFOLLOW) = 3
fcntl(3, F_GETFD)                       = 0
fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
fstat(3, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
fcntl(3, F_GETFL)                       = 0x38800 (flags O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_NOFOLLOW)
fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
fcntl(3, F_DUPFD, 3)                    = 5
fcntl(5, F_GETFD)                       = 0
fcntl(5, F_SETFD, FD_CLOEXEC)           = 0
getdents64(3, /* 22 entries */, 32768)  = 1008
getdents64(3, /* 0 entries */, 32768)   = 0
close(3)                                = 0
%pre%s4%pre%%pre%%pre%%pre%09%pre%%pre%17%pre%%pre%0H:0xgM74\"3"..., 32768) = 32768 read(3, "19H\r7571JL)01C\t3(4310;{45nh@F"..., 32768) = 32768 write(4, "19H\r7571JL)01C\t3(4310;{45nh@F"..., 32768) = 32768 read(3, "ZK1234@752$47];5540d57P7*46646"..., 32768) = 32768 write(4, "ZK1234@752$47];5540d57P7*46646"..., 32768) = 32768 read(3, ".156541{c,$6]421\"4K446677m"..., 32768) = 32768
s4%pre%%pre%%pre%%pre%09%pre%%pre%17%pre%%pre%0H:0xgM74\"3"..., 32768) = 32768 read(3, "19H\r7571JL)01C\t3(4310;{45nh@F"..., 32768) = 32768 write(4, "19H\r7571JL)01C\t3(4310;{45nh@F"..., 32768) = 32768 read(3, "ZK1234@752$47];5540d57P7*46646"..., 32768) = 32768 write(4, "ZK1234@752$47];5540d57P7*46646"..., 32768) = 32768 read(3, ".156541{c,$6]421\"4K446677m"..., 32768) = 32768

e depois alguns:

%pre%

Então, o que exatamente o strace me dá? Estas chamadas do kernel são? Se eles são, o que eles significam (eu sei o que ler e escrever, mas quais são esses números)?

Pergunta de bônus: Existe uma maneira de eu ver algo "abaixo" do que o strace me mostra? CPU chamadas talvez?

    
por n0pe 03.08.2011 / 02:29

2 respostas

5

So, what exactly does strace give me?

O que o strace está dando a você são chamadas de sistema - chamadas que estão solicitando ao kernel fazer algo que o processo em si não pode fazer, como abrir arquivos. (e.x. fcntl , close , etc são encontrados em seu rastreio).

If they are, what do they mean (I know what read and write do but what are those numbers)?

fcntl (3, F_GETFD) = 0

Traduz em: chamada de sistema (fcntl) com argumentos (3, F_GETFD) que está retornando um valor (0) .

Bonus Question: Is there a way for me to see anything "lower" than what strace shows me? CPU calls maybe?

Você quer dizer 1) CPU interrompe ou 2) instruções de montagem. Eu não sei, honestamente, mas:

  1. Assistir interrupções de fogo parece que não seria tão útil.
  2. Observar as instruções que o processador está executando parece um pouco baixo, e ainda não é tão útil. Francamente, se eu quisesse, apenas executaria meu programa em um emulador muito lento que me permite ver qual montagem é interpretada.

strace tem uma página man - sugiro que você leia se quiser detalhes sobre seu funcionamento.

    
por 03.08.2011 / 02:55
2

Você conseguiu a resposta certa em sua pergunta original.

O comportamento padrão de strace é relatar quais chamadas do sistema estão sendo executadas para esse processo, ele também relatará os sinais chamados e qual manipulador tratou esse sinal.

No seu exemplo, os syscalls que estão sendo chamados estão no início da linha: fcntl() , getdents64() close() etc.

Os argumentos que foram passados para esses syscalls são mostrados - muitas vezes truncados, já que os dados brutos podem ter kilo / mega / giga Bytes em tamanho) fstat(3, {st_mode=S_IFDIR|0755, st_size=4096, ...}) (o ... doa o truncamento). O que esses valores representam varia de syscall a syscall, mas man mostrará o que eles representam (desde que você tenha o conjunto básico de páginas man relacionadas às chamadas sys instaladas em seu sistema). man 2 fstat mostrará a página de manual do programador para fstat e detalha os argumentos.

E o resultado desse syscall getdents64(3, /* 22 entries */, 32768) = 1008 1008 neste caso. O valor deste código de resultado será documentado na página man (1) do syscall específico sendo chamado da mesma forma que os argumentos são detalhados. Note que neste caso o /* 22 entries */ é outra operação de truncamento por strace, isso pode ser expandido com -e abbr=none .

Observe que strace não é um comando universal, algumas versões do uso do unix truss , ktrace e dump executam depuração semelhante em um processo. Você também deve dar uma olhada na página de manual do strace, ele vem com algumas opções estendidas (talvez isso aproxime sua questão de bônus ) como -i (imprima o ponteiro de instrução) -v ( verbosity) -a (altere a localização - coluna - da parte do resultado para ver mais dos argumentos passados para o comando) e filtragem de expressão -e .

edit adicionou algumas notas sobre o truncamento de outros argumentos de formulários.

    
por 03.08.2011 / 02:50