Equivalente a "truss -T" e "truss -U" no Linux?

12

Existe um equivalente ao que a opção -Te -Udo trussutilitário Solaris faz no Linux.

Esses são para especificar uma chamada do sistema ( -T) ou função de biblioteca ( -U) que, quando chamada pelo aplicativo rastreado, faria com que ele parasse.

Ou, dito de outra forma, eu gostaria que qualquer processo iniciado por um aplicativo rastreado fosse interrompido (como se matado pelo SIGSTOP) assim que ele fizer uma chamada de sistema ou uma chamada de função de biblioteca compartilhada.

stracee ltraceno Linux fornecem muitos dos recursos do Solaris truss, mas eles não parecem estar fazendo isso.

Por exemplo:

truss -f -T open cmd

Seria assim, strace -f cmdexceto que, se o processo em execução cmdou qualquer de seus descendentes fizer uma openchamada do sistema, ele seria interrompido imediatamente (e eu posso retomar mais tarde, conforme minha conveniência)

Em alguns casos, eu poderia usar gdbos catch syscall, mas estava procurando uma solução que pudesse seguir os garfos de maneira conveniente e continuar fazendo isso para todos os processos bifurcados e continuar fazendo isso mesmo depois de execves.

Parece que me lembro de algum utilitário que oferece a mesma funcionalidade, mesmo uma (ou opções para esse mesmo utilitário) para aplicativos de etapa única entre algumas ocorrências de algum syscall remotamente assim, mas minha memória está com uma falha de memória, não posso nem ter certeza isso foi no Linux.

Stéphane Chazelas
fonte
1
Não é realmente uma resposta para sua pergunta, mas o gdb tem algumas opções para seguir os garfos, simplesmente não interrompe um execve. No entanto, ele ainda faz apenas um processo de cada vez, o que provavelmente é um rompimento de acordos se você estiver procurando por uma funcionalidade semelhante a strace, mas pensei em mencioná-lo apenas por precaução.
precisa saber é o seguinte
@JoelDavis, obrigado. E parece que também pode seguir após exec ( follow-exec-mode), estou experimentando isso. Não responde estritamente à pergunta, mas pode ser bom o suficiente para o que eu preciso.
Stéphane Chazelas
Se eu entendi sua pergunta, você está procurando uma maneira de rastrear até que um sinal específico seja visto e, em seguida, pare o rastreamento, não interrompa ou interrompa o aplicativo que você está rastreando, certo?
slm
@ slm, não, eu quero que um processo iniciado por um aplicativo rastreado seja interrompido (como se matado pelo SIGSTOP) assim que ele fizer uma chamada de sistema. Adicionei um link à página de trussmanual do Solaris .
Stéphane Chazelas
Deixe-me ter certeza de que entendi corretamente. Você deseja uma maneira de interromper um processo quando ele faz uma chamada de sistema específica. Isso está correto?
Sparticvs

Respostas:

3

Que eu saiba, isso não pode ser feito com stracea ptracefunção que é usada internamente SIGSTOPou SIGINTem chamadas.

EDITAR:

Eu inseri esta solução simples em ministrace , para que nenhuma codificação seja necessária.

Minha solução proposta, se nem todas as funcionalidades do strace forem necessárias, seria modificar o ministerace - que eu encontrei aqui Escreva um strace em 70 linhas de código .

Em um programa único, você pode adicionar duas linhas antes do seguinte código:

if (wait_for_syscall(child) != 0) break;

Pseudo-código:

if(syscall == SYS_write)
    do {
        char str[4];
        gets(str);  // waits until enter to continue    
    } while(0);

Eu não dediquei nada disso, essas etapas finais são deixadas para você.

Daniël W. Crompton
fonte
Obrigado. Funciona e esse link é muito útil. No entanto (compreensivelmente em algumas linhas de código), ele não faz a decodificação arg que o gdb / strace faz, portanto, não teria sido útil para o meu propósito. Isso mostra que é fácil de fazer. Eu optei pelo gdb no final, mas parece que o patch do patch seria relativamente fácil. Deixando a questão em aberto, suspeito que exista um comando para fazer isso. Vou dar uma olhada no python-ptrace quando tiver tempo.
Stéphane Chazelas
Seja bem-vindo! Fui um pouco louco ao estender a implementação, para que fosse possível fazer referência ao syscall por id e por nome. Foi divertido brincar com o ptrace novamente.
Daniël W. Crompton