既然El Capitan是“无根的”,有什么办法可以使dtrace工作?


21

我发现dtrace是调试和解决各种问题的宝贵工具,更不用说Apple作为El Capitan的一部分提供的两打dtrace工具包脚本。

但是在El Cap上,运行dtrace通常会导致无休止的错误喷发,使dtrace几乎毫无用处。

Answers:


18

可以禁用10.11中的系统完整性保护,尽管这不是您应该轻而易举的事情。

您可以通过执行以下操作完全禁用SIP:

  1. 重新启动Mac
  2. 重新启动时按住⌘R
  3. 在“ 实用工具”菜单中,运行“ 终端”
  4. 输入以下命令
csrutil disable

另外,您还可以dtrace通过运行以下命令来重新启用SIP,同时仍然允许其工作:

csrutil enable --without dtrace

请注意,这样做时会收到以下警告:

这是不受支持的配置,将来可能会中断,并使您的计算机处于未知状态。

重新启动后,dtrace将像在优胜美地一样工作。


干得好-回答其他线程:-)我要当我错过了这个帖子重新插拔丰富的会议视频和博客:derflounder.wordpress.com/2015/10/01/...
bmike

2
这不是真的。通过csrutil启用DTrace后,您可以调用内核的DTrace-但只能在没有受限权利标志的二进制文件上调用。您不能在所有SIP都关闭的情况下删除受限权利标志,即使是root用户也是如此。这意味着启用DTrace后,您只能DTrace非系统二进制文件。但是,如果非系统二进制文件使用安装在系统文件夹中的共享库(很多程序都这样做),则您也不能DTrace。因此,使dtrace“像在优胜美地一样工作”的唯一方法是制作所有系统文件夹的副本,并将其chroot
JJ

4

例如,将二进制文件复制到不受限制的目录中, /tmp

csrutil disable在某种程度上对桁架不起作用。但是正如@JJ所说的那样chroot,这启发了我。

仍然我不知道为什么这样。我想这可能与“受保护的目录”有关。

这是测试:

CC@~ $ csrutil status
System Integrity Protection status: disabled.
CC@~ $ sudo dtruss /bin/echo
dtrace: failed to execute /bin/echo: dtrace cannot control executables signed with restricted entitlements
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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.