Strace / ptrace pode causar um travamento do programa?

5

Então, recentemente, eu estava discutindo strace com alguém, e eles estavam perguntando o que aconteceria se você tivesse um processo em execução, assim como estava criando um soquete de rede ou algo similar. Isso poderia fazer com que o programa falhasse de maneiras inesperadas?

Pelo que eu li sobre o ptrace, o syscall usado pelo strace, ele não deveria ser capaz de causar algo assim se você estivesse apenas depurando um thread. O processo é interrompido, toda vez que um syscall é chamado, mas deve ser retomado mais tarde e não é o mais sábio. Sinais são colocados na fila enquanto ele não está rodando, então eu assumo que algo similar acontece com syscalls / sockets / listen.

O ptrace usado no contexto da strace pode causar falhas estranhas no processo?

    
por Brandon Wamboldt 04.08.2014 / 17:35

3 respostas

8

Não , strace não deve causar uma falha no programa -

Exceto neste caso incomum:

Se houver um bug que dependa do tempo de execução ou dos locais de memória de tempo de execução .

Isso pode desencadear esse tipo de " heisenbug " - mas extremamente raramente, porque esse tipo de bug é raro e precisa ser acionado apenas sob strace ou outra instrumentação. E quando você encontra um heisenbug, geralmente é uma coisa boa.

Em relação ao ptrace() - o syscall - que é exatamente o que o strace faz por dentro, eu acho, então é similar. É possível fazer mais do que strace ao usar ptrace() diretamente.


Seu exemplo seria apenas esse tipo de bug:

No exemplo, strace alteraria o tempo das etapas para criar uma conexão de rede. Se isso causa um problema, era um "problema esperando para acontecer" - o tempo de execução muda constantemente. Com strace , só um pouco mais. Mas qualquer outro aplicativo poderia ter mudado mais o tempo, como iniciar um programa.

    
por 04.08.2014 / 18:30
2

what would happen if you straced a running process just as it was creating a network socket or something similar.

Coisas assim são feitas através de chamadas de sistema , o que significa que o processo faz uma requisição ao kernel, e o kernel cumpre isto. O kernel também faz a mágica para fazer ptrace() funcionar. Enquanto isso não significa que seria impossível para ele tropeçar em si mesmo (o que seria um bug), parece improvável, pois isso é explicitamente um de seus propósitos: coordenar processos em um sistema multitarefa.

    
por 04.08.2014 / 17:59
0

Eu acho que stracing processos GUI, muitas vezes leva a falhas, mesmo em sistemas operacionais recentes (pelo menos, o OpenSuse 12.3, eu não tentei especificamente em 13.1 como eu praticamente desisti de stracing processos GUI).

Não me lembro de ver o stracing de um lead de processo não-GUI em travamentos em qualquer sistema operacional recente.

    
por 05.08.2014 / 01:12

Tags