在OS X 10.11 El Capitan中看起来像,dtruss
并且dtrace
无法再执行其应做的工作。这是我尝试运行时遇到的错误sudo dtruss curl ...
:
dtrace:无法执行curl:dtrace无法控制使用受限权利签名的可执行文件
我遇到了注意到此问题的人,但到目前为止还没有解决方案。
有没有办法解决此问题或解决此问题?
在OS X 10.11 El Capitan中看起来像,dtruss
并且dtrace
无法再执行其应做的工作。这是我尝试运行时遇到的错误sudo dtruss curl ...
:
dtrace:无法执行curl:dtrace无法控制使用受限权利签名的可执行文件
我遇到了注意到此问题的人,但到目前为止还没有解决方案。
有没有办法解决此问题或解决此问题?
Answers:
跟进亚历山大·乌沙科夫和查尔斯的答案:
一旦你csrutil enable --without dtrace
,还有就是复制二进制一种替代方案:在运行一个终端窗口中的二进制和跟踪终端处理本身在另一个终端窗口。
在第一个终端窗口中,找到其PID:
$ echo $$
1154
在第二个终端窗口中,开始跟踪:
$ sudo dtruss -p 1154 -f
返回,在第一个终端窗口中,运行要跟踪的过程:
$ 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
dtruss -n
也可以。这是比复制更好的解决方法。
对于那些想要dtrace之后的系统附带二进制文件的人,例如csrutil disable
,将copy
其存储到非“受限”目录中,/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
~$ sudo dtruss -f -t open sudo -u $USER /tmp/Picasa dtrace: failed to execute sudo: dtrace cannot control executables signed with restricted entitlements
正如Andrew所注意到的,这是因为系统完整性保护(也称为“无根”)。
您可以完全或部分禁用它(仅在有某些限制的情况下启用dtrace)。
完全禁用SIP
尽管Apple不建议这样做,但是您可以在Mac上完全禁用系统完整性保护。这是如何做:
- 将您的Mac引导到恢复模式:重新引导它并按住cmd + R,直到出现进度栏。
- 转到实用程序菜单。选择那里的终端。
- 输入此命令以禁用系统完整性保护:
$ csrutil disable
它将要求您重新启动-这样做就可以从SIP中解放出来!
部分禁用SIP
幸运的是,SIP不是整体的:它由许多不同的模块构建而成,我们可以分别禁用/启用。
重复上述“完全禁用SIP”部分中的步骤1和2。现在在终端中输入以下命令:
$ csrutil clear # restore the default configuration first $ csrutil enable --without dtrace # disable dtrace restrictions *only*
重新启动并再次使用您的操作系统。
Dtrace开始起作用,但是您仍然无法将dtrace附加到受限制的进程
我会将其发布为评论,但我不允许。
禁用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.
对于在复制后仍然可以正常运行的二进制文件,这是最佳选择,因为它可以捕获进程的整个生命周期,并且不需要禁用任何保护措施。
/sbin/ifconfig
。输出为dtrace: failed to execute ./ifconfig: (os/kern) failure
。
dtrace
,ifconfig
因此无法附加。简单codesign --remove-signature ./ifconfig
,它应该可以工作!
似乎完全禁用SIP仍然会阻塞受限制进程的truss:
$ /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