Equivalente de “truss -T” e “truss -U” no Linux?

12

Existe um equivalente do que a opção -T e -U do truss O utilitário Solaris funciona no Linux.

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

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

strace e ltrace no Linux fornecem muitos dos recursos do Solaris truss , mas eles não parecem estar fazendo isso.

Por exemplo:

truss -f -T open cmd

Seria como strace -f cmd , exceto que se o processo executando cmd ou qualquer de seus descendentes fizesse qualquer chamada de sistema open , ele seria interrompido imediatamente (e eu posso retomar isso mais tarde, por conveniência)

Em alguns casos, eu poderia usar gdb do catch syscall , mas estava procurando uma solução que pudesse acompanhar convenientemente os garfos e continuar fazendo isso para todos os processos bifurcados e continuar fazendo isso mesmo depois de execve s.

Eu pareço lembrar algum utilitário que oferece a mesma funcionalidade, até mesmo uma (ou opções para o mesmo utilitário) para aplicativos de etapa única entre algumas ocorrências de alguns syscall remotamente assim, mas minha memória está falhando, não posso até mesmo ter certeza de que estava no Linux.

    
por Stéphane Chazelas 21.06.2013 / 13:57

2 respostas

3

No melhor de meu conhecimento, isso não pode ser feito com strace , a função ptrace que é usada internamente faz SIGSTOP ou SIGINT nas chamadas.

EDITAR:

Inseri esta solução simples em ministrace , portanto, não é necessário codificação.

Minha solução proposta, se não for necessária toda a funcionalidade do strace, seria modificar o ministério - que eu encontrei aqui Escreva-se um strace em 70 linhas de código .

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

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

Pseudocódigo:

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

Eu não estudei nada disso, estas etapas finais foram deixadas para você.

    
por 12.07.2013 / 23:03
2

O Systemtap deve ser capaz de fazer o que você está procurando, isso é um bom guia para isso:

link

    
por 19.08.2013 / 13:48