Équivalent de "truss -T" et "truss -U" sous Linux?

Existe-t-il un équivalent de ce que l' -T et -U de l'utilitaire Solaris truss fait sur Linux.

Ceux-ci doivent spécifier un appel système ( -T ) ou une fonction de bibliothèque ( -U ) qui, lorsqu'il est appelé par l'application tracée, l'arrêtera.

Ou, autrement dit, je souhaiterais que tout process démarré par une application tracée soit arrêté (comme s'il était tué par SIGSTOP) dès qu'il effectue un appel système donné ou un appel de fonction de bibliothèque partagée donné.

strace et ltrace sous Linux fournissent une grande partie du jeu de caractéristiques de Solaris, mais ils ne semblent pas le faire.

Par exemple:

 truss -f -T open cmd 

Serait comme strace -f cmd sauf que si le process exécutant cmd ou l'un de ses descendants fait un appel système open , il serait arrêté immédiatement (et je peux le reprendre plus tard à ma convenance)

Dans certains cas, je pouvais utiliser la command catch syscall , mais je cherchais une solution qui puisse facilement suivre les fourches et continuer à le faire pour tous les process bifurqués et continuer à le faire même après les execve .

Je me souviens d'un utilitaire qui donne la même fonctionnalité, même une (ou des options à ce même utilitaire) aux applications en une seule étape entre certaines occurrences de certains syscall à distance comme ça, mais ma memory me manque, je ne peux même pas être sûr c'était sur Linux.

Pour autant que je sache, cela ne peut pas être fait avec strace , la fonction ptrace qui est utilisée en interne fait SIGSTOP ou SIGINT sur les appels.

MODIFIER:

J'ai inséré cette solution simple en ministrace , donc aucun encoding n'est nécessaire.

Ma solution proposée, si toutes les fonctionnalités de strace ne sont pas nécessaires, serait de modifier ministrace – que j'ai trouvé ici écrivez-vous une strache dans 70 lignes de code .

Dans un programme one shot, vous pouvez append deux lignes avant le code suivant:

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

Pseudo code:

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

Je n'ai pas testé tout cela, ces dernières étapes vous sont laissées.

Systemtap devrait être capable de faire ce que vous searchz, c'est un bon guide pour cela:

https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_Linux/5/html/SystemTap_Beginners_Guide/