Depuração de tempos limite de conexão usando strace?

4

Estou tentando descobrir por que o Eclipse está girando, então decidi acionar o Strace.

Eu encontrei o processo do eclipse usando:

$ ps ax | grep java
 5546 ?        Sl    19:04 /usr/bin/java ... [arguments omitted]

Ao executar strace nesse processo, vejo que ele está aguardando outro processo:

$ sudo strace -p 5546
Process 5546 attached - interrupt to quit
futex(0x7f6c416679d0, FUTEX_WAIT, 5547, NULL^C <unfinished ...>
Process 5546 detached

Curiosamente, o processo 5547 não aparece em ps (alguém pode me dizer por quê?), mas eu posso strace . É repetidamente cuspindo muitas falhas EAGAIN (com o sucesso ocasional)

read(16, 0x7f6c41664d10, 16)            = -1 EAGAIN (Resource temporarily unavailable)
recvfrom(15, 0x7f6c3815f2e4, 4096, 0, 0, 0) = -1 EAGAIN (Resource temporarily unavailable)
clock_gettime(CLOCK_MONOTONIC, {67410, 357843264}) = 0
poll([{fd=16, events=POLLIN}, {fd=15, events=POLLIN}, {fd=68, events=POLLIN}, {fd=128, events=POLLIN}, {fd=69, events=POLLIN}], 5, 0) = 0 (Timeout)
read(16, 0x7f6c41664cb0, 16)            = -1 EAGAIN (Resource temporarily unavailable)
recvfrom(15, 0x7f6c3815f2e4, 4096, 0, 0, 0) = -1 EAGAIN (Resource temporarily unavailable)
...

A partir da saída, parece que está pesquisando os descritores de arquivos 16, 15, 68, 128 e 69. Particularmente, os erros EAGAIN são provenientes dos fds 15 e 6, como visto no read(2) e recvfrom(2) chamadas.

Como posso encontrar mais informações sobre esses fds? Eu tentei lsof -p 5547 , mas nenhuma saída foi impressa. Eu suspeito que estes são soquetes que estão abertos para algum site, mas por que ele está girando em um loop com EAGAIN falhas é intrigante ...

    
por jabalsad 13.06.2012 / 13:33

2 respostas

2

Alguns PIDs não estão listados porque pertencem a threads . htop pode mostrá-los se você pressionar Shift + H (e opcionalmente T para visualização em árvore), mas lsof quer o PID do processo principal. (Todos os pthreads em um processo compartilham descritores de arquivos, de qualquer maneira.) Você também pode dar uma olhada em /proc/5546/fd/ e /proc/5546/task/ .

EAGAIN é normal para E / S sem bloqueio; por exemplo, ele é retornado por read() quando não há dados para ler. Veja "ERROS" em read (2) , escreva (2) e assim por diante. Alguns desses fd's provavelmente são conexões com o servidor X11 - a E / S sem bloqueio é usada pelas bibliotecas do cliente X11.

    
por 13.06.2012 / 14:32
2

O terceiro parâmetro para futex(2) não é necessariamente um ID de processo, o manual diz que é futex(uaddr, op, val, timeout, ...) e que, se op for FUTEX_WAIT , "verifica atomicamente que o endereço futex uaddr ainda contém o valor val , e dorme aguardando FUTEX_WAKE neste endereço futex. [Quando] tempo limite é NULL, a chamada é bloqueada indefinidamente. "

No seu caso, parece que o processo 5546 estava lá esperando por algo - presumivelmente seu tópico 5547 ou algo relacionado, mas não podemos saber exatamente o que é certo baseado apenas nisso - escrever esse número em o endereço de memória especificado.

Note também que você pode ver os tópicos usando ps -eLf ou similar.

    
por 02.05.2015 / 21:50