Eu tenho um programa que de repente começou a não terminar (eu não estava atualizando o programa, mas meu sistema e o kernel, não me lembro o que estava causando o efeito. Recompilar o programa não mudou o comportamento de não terminar). Sob strace
, no entanto, ele termina.
Como essas coisas podem ser rastreadas?
Exemplo concreto:
Aqui está o exemplo concreto em que encontrei essa coisa estranha )(para mim):
Trata-se de WWWOFFLE , SVN revisão 2250 (mais recente no momento da investigação/escrita), compilado em Arch/Artix Linux de acordo com o pacote AUR .
Desde algum tempo (sem atualização de WWWOFFLE, mas atualizações de sistema e kernel, e após o aparecimento deste problema recompilação de WWWOFFLE sem uma mudança perceptível) colocar wwwoffle no modo online ou offline trava com bastante frequência indefinidamente. Se eu quiser rastreá-lo com
strace
, ele não trava. Se eu envolvê-lo em um script de shell, ele trava com strace
, mas não com strace -f
/ strace -ff
.
Detalhes:
iniciar
wwwoffled
servidor:wwwoffled -c /etc/wwwoffle/wwwoffle.conf -f -d 6
coloque WWWOFFLE no modo online (mudar do modo offline para o online geralmente é bem-sucedido):
wwwoffle -c /etc/wwwoffle/wwwoffle.conf -online
Saída do terminal:
WWWOFFLE Now Online
e retorne ao shell de chamada.
coloque WWWOFFLE no modo offline:
wwwoffle -c /etc/wwwoffle/wwwoffle.conf -offline
Saída do terminal:
WWWOFFLE Now Offline
e sem rescisão.
O log de
wwwoffled
acordo com o número 1 diz corretamenteImportant: WWWOFFLE Offline
. Abortarwwwoffle -c /etc/wwwoffle/wwwoffle.conf -offline
com<STRG>+<c>
e tentar novamente agora é impresso corretamenteWWWOFFLE Already Offline
, mas também não termina.mudar para o modo online enquanto WWWOFFLE já está online também não termina:
wwwoffle -c /etc/wwwoffle/wwwoffle.conf -online
enquanto o WWWOFFLE já estiver online imprime corretamente
WWWOFFLE Already Online
mas não termina.
strace
:strace wwwoffle -c /etc/wwwoffle/wwwoffle.conf -offline
e
strace wwwoffle -c /etc/wwwoffle/wwwoffle.conf -online
parece sempre terminar quando
wwwoffled
é iniciado como em 1.Se eu colocar
wwwoffle -c /etc/wwwoffle/wwwoffle.conf -offline
ewwwoffle -c /etc/wwwoffle/wwwoffle.conf -online
em um script bash:#!/bin/bash wwwoffle -c /etc/wwwoffle/wwwoffle.conf -offline
e executá-lo, então também com
strace
ele não termina:strace ./wwwoffle-off.sh
imprime como as últimas linhas
[...] access("/usr/bin/wwwoffle", R_OK) = 0 rt_sigprocmask(SIG_BLOCK, [INT CHLD], [], 8) = 0 clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f36a75e1e50) = 6426 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0 rt_sigaction(SIGINT, {sa_handler=0x5573f5295be0, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f36a76898b0}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f36a76898b0}, 8) = 0 wait4(-1, WWWOFFLE Already Offline
e esperando lá para sempre. (Observe que
WWWOFFLE Already Offline
é a saída dewwwoffle
e é gravada emstdout
, a última saída destrace
, gravada emstderr
, éwait4(-1,
)Com
strace -f
oustrace -ff
(que rastreia também threads filho bifurcados), ele termina novamente.
Eu vejo isso apenas com WWWOFFLE, mas pode não ser um problema WWWOFFLE. Não faço ideia de como rastrear. Como essas coisas podem ser rastreadas, o que pode causar tal comportamento?
Isso geralmente é um sintoma de algo errado no software de alguma forma, nenhuma resposta geral pode ser dada.
Portanto, é realmente específico para os bugs no software concreto que mostra esse comportamento.
No caso WWWOFFLE, ouvir a comunicação da rede entre
wwwoffle
ewwwoffled
revela algumas informações.