J'écris un outil qui appelle DTrace pour tracer le programme spécifié par l'utilisateur. Si mon outil utilise dtrace -c pour exécuter le programme en tant que sous-processus de DTrace, non seulement je ne peux transmettre aucun argument au programme, mais le programme fonctionne avec tous les privilèges de DTrace, c'est-à-dire en tant que root (Je suis sur Mac OS X). Cela rend certaines choses qui devraient fonctionner et, évidemment, fait beaucoup de choses qui ne devraient pas fonctionner.Comment tracer un programme depuis ses débuts sans l'exécuter en tant que root
L'autre solution que je connaisse est de commencer moi-même le programme, mettre en pause en l'envoyant SIGSTOP
, passez son PID à dtrace -p
, continuer ensuite en l'envoyant SIGCONT
. Le problème est que soit le programme s'exécute pendant quelques secondes sans être suivi pendant que DTrace rassemble les informations de symbole ou, si je dors pendant quelques secondes avant de continuer le processus, DTrace se plaint que objc<pid>:<class>:<method>:entry
ne correspond à aucune sonde.
Existe-t-il un moyen de lancer le programme sous le compte de l'utilisateur, pas en tant que root, mais DTrace peut encore le suivre depuis le début?
Encore mieux: roulez tout en un. Créez un tuyau, une fourchette, demandez à l'enfant d'attendre sur le tuyau, dtrace -p CHILD_PID, écrivez dans le tuyau, l'enfant se réveille et appelle exec. – bstpierre
Cela semble prometteur. Je ne sais pas si cela fonctionnera, cependant: Mon outil est écrit en Python, et il est conçu pour tracer des programmes Cocoa. Sans aucun Cocoa dans mon outil, je pense que j'obtiendrai toujours l'erreur que le fournisseur d'objc ne correspond à aucune sonde. Mais je vais essayer demain. –