Это означает, что сценарий DTrace, который dtruss
использует внутри, обращается к недопустимому адресу памяти, который происходит, когда он пытается отследить вызываемый execve
вызов, который вам интересен. Так что, по сути, dtruss
(или, возможно, сам DTrace), похоже, содержит ошибку, которая мешает вам получить нужную информацию. К сожалению, Apple не была лучшей в поддержании DTrace и зависящих от него инструментов, хорошо работающих на macOS: - /.
В частности, для сценариев Bash / shell вы можете заставить его печатать каждую выполняемую команду, добавив set -x
вверху вашего сценария (дополнительная информация в этом другом ответе ).
Если вы хотите, вы также можете попробовать использовать DTrace напрямую - это довольно простая однострочная (не пробовал запускать это сам, поэтому извиняюсь, если есть опечатки):
sudo dtrace -n 'proc:::exec-success /ppid == $target/ { trace(curpsinfo->pr_psargs); }' -c './script.sh'
Как это работает:
proc:::exec-success
: Трассировка всех exec-success
событий в системе, которые запускают в подпроцессе , когда системный вызов exec*
-семейства успешно возвращается.
/ppid == $target/
: Фильтр, который означает, что это срабатывает, только когда PID родительского процесса (ppid
) совпадает с PID, возвращенным для процесса, запущенного параметром -c
, который мы передали dtrace
команда ($target
).
{ trace(curpsinfo->pr_psargs); }
: Это действие, которое нужно предпринять, когда событие срабатывает и соответствует нашему фильтру. Мы просто печатаем (trace
) аргументы, переданные процессу, которые хранятся в переменной curpsinfo
.
(Если это не удается с похожей ошибкой, вероятно, ошибка в реализации macOS где-то curpsinfo
.)