On dirait que sous OS X 10.11 El Capitan, dtruss
et dtrace
ne peuvent plus faire ce qu’ils sont censés faire. C'est l'erreur que j'obtiens lorsque j'essaie de lancer Sudo dtruss curl ...
:
dtrace: échec de l'exécution de curl: dtrace ne peut pas contrôler les exécutables signés avec des droits restreints
J'ai rencontré des gens remarquant ce problème mais, jusqu'à présent, aucune solution.
Y at-il un moyen de résoudre ce problème ou de contourner ce problème?
Une fois que vous csrutil enable --without dtrace
, il existe une alternative à la copie du binaire: exécutez le binaire dans une fenêtre de terminal et suivez le processus du terminal lui-même dans une autre fenêtre de terminal.
Dans la première fenêtre du terminal, trouvez son PID:
$ echo $$
1154
Dans la deuxième fenêtre du terminal, commencez la trace:
$ Sudo dtruss -p 1154 -f
Retour, dans la première fenêtre du terminal, exécutez le processus que vous souhaitez suivre:
$ ls
À ce stade, vous devriez voir la trace dans la deuxième fenêtre. Ignorez les entrées du PID que vous tracez (par exemple, 1154) et le reste concerne le processus (et ses descendants) qui vous intéresse.
1154/0x1499: sigprocmask(0x3, 0x7FFF53E5C608, 0x0) = 0x0 0
1154/0x1499: sigprocmask(0x1, 0x7FFF53E5C614, 0x7FFF53E5C610) = 0x0 0
3100/0xa9f3: getpid(0x7FFF82A35344, 0x7FFF82A35334, 0x2000) = 3100 0
3100/0xa9f3: sigprocmask(0x3, 0x10BE32EF8, 0x0) = 0x0 0
Pour ceux qui veulent dtrace le système binaire livré après csrutil disable
, copy
it dans un répertoire non "restreint", par exemple, /tmp
CC@~ $ csrutil status
System Integrity Protection status: disabled.
CC@~ $ cp /bin/echo /tmp
CC@~ $ Sudo dtruss /tmp/echo
SYSCALL(args) = return
thread_selfid(0x0, 0x0, 0x0) = 46811 0
csops(0x0, 0x0, 0x7FFF51B6CA20) = 0 0
issetugid(0x0, 0x0, 0x7FFF51B6CA20) = 0 0
shared_region_check_np(0x7FFF51B6A918, 0x0, 0x7FFF51B6CA20) = 0 0
stat64("/usr/lib/dtrace/libdtrace_dyld.dylib\0", 0x7FFF51B6BEA8, 0x7FFF51B6CA20 = 0 0
Voir le commentaire de @ JJ: https://Apple.stackexchange.com/questions/208762/now-that-el-capitan-is-rootless-is-there-any-way-to-get-dtrace -travail/224731 # 224731
Comme Andrew le remarque, c'est à cause de System Integrity Protection , également appelé "sans racine".
Vous pouvez le désactiver complètement ou partiellement (activez simplement dtrace avec certaines limitations).
Désactiver complètement SIP
Bien que cela ne soit pas recommandé par Apple, vous pouvez entièrement désactiver la protection de l’intégrité du système sur votre Mac. Voici comment:
- Démarrez votre Mac en mode de récupération: redémarrez-le et maintenez la touche cmd + R enfoncée jusqu'à ce qu'une barre de progression apparaisse.
- Aller au menu Utilitaires. Choisissez Terminal ici.
- Entrez cette commande pour désactiver la protection de l'intégrité du système:
$ csrutil disable
Il vous demandera de redémarrer - faites-le et vous êtes libre de SIP!
Désactiver partiellement SIP
Heureusement, SIP n'est pas monolithique: il est construit à partir de nombreux modules différents que nous pouvons désactiver/activer séparément.
Répétez les étapes 1 et 2 de la section "Désactiver complètement SIP" ci-dessus. Maintenant, dans Terminal, entrez ces commandes:
$ csrutil clear # restore the default configuration first $ csrutil enable --without dtrace # disable dtrace restrictions *only*
Redémarrez et profitez de votre système d'exploitation à nouveau.
Dtrace commence à fonctionner mais vous êtes toujours incapable pour lier dtrace à des processus restreints
Je posterais ceci comme un commentaire mais je ne suis pas autorisé.
Désactiver SIP est pas nécessaire. Copiez simplement le fichier binaire vers un autre emplacement et cela fonctionnera parfaitement:
$ Sudo dtruss ping google.com
dtrace: system integrity protection is on, some features will not be available
dtrace: failed to execute ping: dtrace cannot control executables signed with restricted entitlements
$ Sudo cp $(which ping) .
$ Sudo dtruss ./ping google.com
dtrace: system integrity protection is on, some features will not be available
SYSCALL(args) = return
PING google.com (172.217.10.78): 56 data bytes
^C
$ csrutil status
System Integrity Protection status: enabled.
Pour les fichiers binaires qui peuvent toujours fonctionner normalement après avoir été copiés, il s'agit de la meilleure solution, car elle capture toute la durée de vie du processus et ne nécessite aucune désactivation de la protection.
On dirait que la désactivation complète SIP bloque toujours dtruss pour les processus restreints:
$ /usr/bin/csrutil status
System Integrity Protection status: disabled.
$ Sudo dtruss /bin/echo "blah"
dtrace: failed to execute /bin/echo: dtrace cannot control executables signed with restricted entitlements
$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.11.2
BuildVersion: 15C50
Voir ma réponse sur connexe question "Comment peut-on obtenir que dtrace exécute la commande suivie avec des privilèges non root?" [sic].
DTrace peut surveiller les processus en cours d'exécution. Démarrez donc un processus en arrière-plan qui attend 1 seconde pour le démarrage de DTrace (désolé pour la situation de concurrence) et surveillez le PID de ce processus.
Sudo true && \
(sleep 1; ps) & \
Sudo dtrace -n 'syscall:::entry /pid == $1/ {@[probefunc] = count();}' $! \
&& kill $!
Explication complète en réponse liée.