Теперь, когда El Capitan «без корня», есть ли способ заставить работать dtrace?

21

Я обнаружил, что dtrace - это бесценный инструмент для отладки и устранения проблем всех видов проблем, не говоря уже о двух десятках сценариев инструментария dtrace, поставляемых Apple как часть El Capitan.

Однако в El Cap запуск dtrace обычно приводит к бесконечному множеству ошибок, делающих dtrace практически бесполезным.

bahamat
источник

Ответы:

18

Защита целостности системы в 10.11 может быть отключена, хотя это не то, что вы должны делать слегка.

Вы можете полностью отключить SIP, выполнив следующие действия:

  1. Перезагрузите свой Mac
  2. Удерживайте ⌘R во время перезагрузки
  3. Из меню Утилиты запустите Терминал
  4. Введите следующую команду
csrutil disable

В качестве альтернативы вы можете повторно включить SIP, продолжая dtraceработать, также выполнив следующее:

csrutil enable --without dtrace

Обратите внимание, что при этом вы получите следующее предупреждение:

Это неподдерживаемая конфигурация, которая может сломаться в будущем и оставить вашу машину в неизвестном состоянии.

После перезагрузки dtraceбудет работать так же, как в Yosemite.

bahamat
источник
Отлично, я пропустил этот пост, отвечая на другой вопрос :-) Я собираюсь повторно подключить сессионное видео и блог Рича
bmike
2
Это не совсем так. С DTrace, включенным через csrutil, вы можете вызывать ядро ​​DTrace - но только для двоичных файлов, у которых нет флага ограниченных прав. Вы не можете удалить флаг с ограниченными правами, даже с правами суперпользователя, при отключенном SIP. Это означает, что с включенной DTrace вы можете использовать только несистемные двоичные файлы DTrace. Однако, если несистемный двоичный файл использует общую библиотеку, установленную в системных папках (что делают многие программы), вы также не сможете использовать DTrace. Таким образом, единственный способ заставить dtrace работать «как это было в Yosemite» - это скопировать все ваши системные папки и выполнить хромирование
JJ
4

Скопируйте двоичный файл в каталог, который не является «ограниченным», например, /tmp

csrutil disableне работает для dtruss в некоторой степени. Но, как сказал @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
Чарльз
источник