Usando strace para depurar o acesso ao arquivo

2

Estou tentando descobrir o caminho completo de um arquivo que um programa em execução está tentando (e falhando) abrir. Eu sou dado a entender que strace pode fazer isso, mas eu aparentemente não estou usando corretamente. O programa em execução é um serviço, por isso não vejo uma maneira fácil de executá-lo em strace diretamente. Os exemplos que vi fazem parecer

$ sudo strace -p <process id> -e open,access

é o encantamento correto para anexar ao processo em execução, mas quando executo isso, não vejo saída, mesmo que o programa em questão esteja registrando sua tentativa fracassada de abrir o arquivo. Eu nem vejo qualquer saída com

$ sudo strace -p 24249
Process 24249 attached - interrupt to quit
futex(0x7f650fe159d0, FUTEX_WAIT, 24250, NULL

Parece que o futex está sendo cortado por algum motivo? Ou essa saída normal para a situação?

De qualquer forma, o que estou fazendo errado?

    
por cbmanica 25.01.2013 / 20:24

1 resposta

1

É possível executar strace no próprio serviço, ou seja, colocá-lo quando você iniciar o serviço manualmente.

strace -ffttTo /tmp/strace.out service <foo> start

E cole o arquivo gerado.

EDIT: Como está falhando ao abrir um arquivo, você pode procurar pela palavra-chave ENOENT ou grep a string No such file or directory .

EDIT2: Eu vi a saída novamente e verifiquei a página man do futex. Então, parece que algo acessando a localização da memória 0x7f650fe159d0 está mantendo um bloqueio, talvez um bloqueio compartilhado e não liberá-lo. O pid 24250 também é um argumento. Você pode verificar o que esta pid está fazendo.

Além disso, você pode verificar a função do kernel que o pid 24249 está associado. Pode ser mostrado usando a opção wchan no comando ps -eo wchan <pid> . Eu não me lembro da lista completa de wchan verbos, mas vou ter que você para você amanhã. (é bastante noite aqui).

    
por 25.01.2013 / 20:38