Équivalent de «truss -T» et «truss -U» sous Linux?

12

Existe-t-il un équivalent de ce que fait l' option -Tet -Ude l' trussutilitaire Solaris sur Linux.

Il s'agit de spécifier un appel système ( -T) ou une fonction de bibliothèque ( -U) qui, une fois appelée par l'application tracée, entraînerait son arrêt.

Ou, dit le contraire, je voudrais que tout processus 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é.

straceet ltracesous Linux fournissent une grande partie des fonctionnalités de Solaris truss, mais ils ne semblent pas le faire.

Par exemple:

truss -f -T open cmd

Serait comme strace -f cmdsauf que si le processus en cours d'exécution cmdou l'un de ses descendants fait un openappel système, il serait arrêté immédiatement (et je peux le reprendre plus tard à ma convenance)

Dans certains cas, je pouvais utiliser gdbdes s catch syscall, mais je cherchais une solution qui puisse facilement suivre les fourches et continuer à le faire pour tous les processus fourchus et continuer à le faire même après execves.

Je semble me rappeler un utilitaire donnant la même fonctionnalité, même une (ou des options à ce même utilitaire) pour des applications en une seule étape entre certaines occurrences de certains appels système à distance comme ça, mais ma mémoire me fait défaut, je ne peux même pas être sûr c'était sous Linux.

Stéphane Chazelas
la source
1
Pas vraiment une réponse à votre question, mais gdb a quelques options pour suivre les fourches, il ne désactive pas simplement un execve. Cependant, il ne fait qu'un seul processus à la fois, ce qui est probablement une rupture de contrat si vous recherchez une fonctionnalité de type strace, mais j'ai pensé que je le mentionnerais juste au cas où.
Bratchley
@JoelDavis, merci. Et il semble que cela puisse également suivre après exec, ( follow-exec-mode), j'expérimente avec ça. Ne répond pas strictement à la question, mais peut être suffisant pour ce dont j'ai besoin.
Stéphane Chazelas
Si je comprends votre question, vous cherchez un moyen de tracer jusqu'à ce qu'un signal spécifique soit vu, puis arrêtez le traçage, n'interrompez pas ou ne tuez pas l'application que vous traquez, n'est-ce pas?
slm
@slm, non, je veux qu'un processus démarré par une application tracée soit arrêté (comme s'il était tué par SIGSTOP) dès qu'il fait un appel système donné. J'ai ajouté un lien vers la trusspage de manuel Solaris .
Stéphane Chazelas
Permettez-moi de m'assurer que je comprends bien. Vous voulez un moyen d'arrêter un processus lorsqu'il effectue un appel système spécifique. Est-ce exact?
sparticvs

Réponses:

3

À ma connaissance, cela ne peut pas être fait strace, la ptracefonction utilisée en interne le fait SIGSTOPou SIGINTlors d'appels.

ÉDITER:

J'ai inséré cette solution simple dans ministrace , donc aucun codage n'est requis.

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

Dans un programme à un coup, vous pouvez ajouter 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 rien testé de tout cela, ces étapes finales vous sont laissées.

Daniël W. Crompton
la source
Merci. Cela fonctionne et ce lien est très utile. Cependant (il est compréhensible dans quelques lignes de code), il ne fait pas le décodage arg que font gdb / strace, donc cela n'aurait pas été utile pour mon but. Cela montre cependant que c'est facile à faire. J'ai opté pour gdb à la fin, mais il semble que l'application de correctifs pour cette fonctionnalité serait relativement facile. Laissant la question ouverte car je soupçonne qu'il existe une commande existante pour le faire. Je regarderai python-ptrace quand j'aurai le temps.
Stéphane Chazelas
Vous êtes les bienvenus! Je suis allé un peu sauvage dans l'extension de l'implémentation, il serait donc possible de référencer l'appel système par id et par nom. C'était encore amusant de jouer avec ptrace.
Daniël W. Crompton