有没有解决方法:“dtrace无法控制使用受限权利签名的可执行文件”?

看起来像OS X 10.11 El Capitan, dtrussdtrace不能再做他们想做的事情。 这是我尝试运行sudo dtruss curl ...时得到的错误sudo dtruss curl ...

dtrace:无法执行curl:dtrace无法控制使用受限授权签名的可执行文件

我遇到人们注意到这个问题,但迄今没有解决scheme。

有没有办法解决这个问题或解决这个问题?

对于那些在csrutil disablecsrutil disable系统二进制文件的用户, csrutil disablecopy到一个非“受限”的目录中,例如/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 

请参阅@ JJ的评论: https : //apple.stackexchange.com/questions/208762/now-that-el-capitan-is-rootless-is-there-any-way-to-get-dtrace-working/224731#224731

一旦你csrutil enable --without dtrace ,有复制二进制文件的替代方法:在一个terminal窗口中运行二进制文件,并在另一个terminal窗口跟踪terminal进程本身。

在第一个terminal窗口中,find它的PID:

 $ echo $$ 1154 

在第二个terminal窗口中,开始追踪:

 $ sudo dtruss -p 1154 -f 

回到第一个terminal窗口,运行你想要追踪的进程:

 $ ls 

此时,您应该在第二个窗口中看到跟踪。 忽略你正在跟踪的PID条目(例如1154),其余的是你感兴趣的进程(及其后代)。

 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 

正如Andrew所说,这是因为系统完整性保护 (也称为“无根”)。

您可以完全或部分地禁用它(启用只有dtrace有一些限制)。

完全禁用SIP

尽pipe不被Apple推荐,但是您可以在Mac上完全禁用系统完整性保护。 就是这样:

  1. 将Mac启动到恢复模式:重新启动并保持cmd + R,直到出现进度条。
  2. 转到实用程序菜单。 在那里selectterminal。
  3. input此命令以禁用系统完整性保护:

$ csrutil disable

它会要求你重新启动 – 这样做,你从SIP免费!

部分禁用SIP

幸运的是,SIP不是单一的,它是由许多不同的模块构成的,我们可以单独禁用/启用。

重复上面“完全禁用SIP”一节中的步骤1和2。 现在在terminalinput这些命令:

 $ csrutil clear # restore the default configuration first $ csrutil enable --without dtrace # disable dtrace restrictions *only* 

重新启动并再次享受您的操作系统。

Dtrace开始工作,但您仍然无法将dtrace附加到受限进程

说明来源: http : //internals.exposed/blog/dtrace-vs-sip.html

看起来像完全禁用SIP仍阻止进程受限制:

 $ /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 

看到我对有关问题的回答 “如何让dtrace以非根权限运行跟踪的命令? [原文如此]。

DTrace 可以监听已经运行的进程。 因此,启动一个后台进程,等待1秒DTrace启动(抱歉争夺条件),并窥探该进程的PID。

 sudo true && \ (sleep 1; ps) & \ sudo dtrace -n 'syscall:::entry /pid == $1/ {@[probefunc] = count();}' $! \ && kill $! 

完整解释链接的答案。

我会张贴这个评论,但我不允许。

禁用SIP是没有必要的。 只需将二进制文件复制到备用位置,它就可以正常工作:

 $ 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. 

对于可以在复制后仍能正常工作的二进制文件,这是最好的select,因为它捕获整个进程的生命周期,并且不需要禁用任何保护。