Por que o strace / truss às vezes 'conserta' processos travados?

4

Às vezes você tem um processo travado que ficou parado por um tempo, e assim que você começa a cutucá-lo com strace / truss apenas para ver o que está acontecendo, ele fica magicamente descolado e continua a rodar! Então, meramente "observando", esses programas têm algum impacto na execução dos programas paralisados ... o que está acontecendo aqui? Strace (acho que via ptrace (2)?) Enviar um sinal, fazendo com que o programa pare de bloquear, ou tal?

Eu já vi isso várias vezes - mais recentemente no Linux RHEL 4 (e um script Perl manipulando processos e fazendo algumas IOs de rede nesse caso), mas em alguns outros contextos também. Infelizmente, não consigo reproduzir isso, como acontece em tempos de crise. Mas minha curiosidade permanece. : -)

Qualquer elucidação é apreciada.

    
por Emmel 23.04.2010 / 07:48

1 resposta

0

Pode ser que seja um bug no kernel ou no programa que você está rastreando?

O programa pode ter implementado incorretamente o loop de eventos que aguarda erros incorretos, mas aguarda outras coisas após EINTR .

Exemplo:

for(;;) {
  select(...);
  if(FD_SET(...i...)) {
    read(...i...);
    write(...j...); // Naive blocking write
  }
}

Ele funcionará em testes triviais, mas todo o programa pode bloquear se qualquer bloco de gravação.

Suspender / retomar o programa interrompe o bloqueio de write e faz com que o loop principal continue.

    
por 05.05.2010 / 18:20