Existe um equivalente ao que a opção -T
e -U
do truss
utilitá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.
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 assim, strace -f cmd
exceto que, se o processo em execução cmd
ou qualquer de seus descendentes fizer uma open
chamada do sistema, ele seria interrompido imediatamente (e eu posso retomar mais tarde, conforme minha conveniência)
Em alguns casos, eu poderia usar gdb
os 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 execve
s.
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.
follow-exec-mode
), estou experimentando isso. Não responde estritamente à pergunta, mas pode ser bom o suficiente para o que eu preciso.truss
manual do Solaris .Respostas:
Que eu saiba, isso não pode ser feito com
strace
aptrace
função que é usada internamenteSIGSTOP
ouSIGINT
em 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:
Pseudo-código:
Eu não dediquei nada disso, essas etapas finais são deixadas para você.
fonte
O Systemtap deve poder fazer o que você está procurando, esse é um bom guia:
https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_Linux/5/html/SystemTap_Beginners_Guide/
fonte