Почему в моей трассировке dtruss нет никаких execve вызовов? - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть такой скрипт:

script.sh

#!/bin/bash

clang -v

Если я сделаю dtruss, я бы ожидал увидеть execve вызов clang.

$ sudo dtruss -f -a -e ./script.sh 

Однако трасса не содержит execve. Вместо этого возникает ошибка:

...
 1703/0x16931:       856       4      0 sigaction(0x15, 0x7FFEE882A3B8, 0x7FFEE882A3F8)      = 0 0
 1703/0x16931:       858       4      0 sigaction(0x16, 0x7FFEE882A3C8, 0x7FFEE882A408)      = 0 0
 1703/0x16931:       874       4      0 sigaction(0x2, 0x7FFEE882A3C8, 0x7FFEE882A408)       = 0 0
 1703/0x16931:       881       4      0 sigaction(0x3, 0x7FFEE882A3C8, 0x7FFEE882A408)       = 0 0
 1703/0x16931:       883       4      0 sigaction(0x14, 0x7FFEE882A3C8, 0x7FFEE882A408)      = 0 0
dtrace: error on enabled probe ID 2149 (ID 280: syscall::execve:return): invalid address (0x7fc2b5502c30) in action #12 at DIF offset 12
 1703/0x16932:      2873:        0:       0 fork()       = 0 0
 1703/0x16932:      2879     138      5 thread_selfid(0x0, 0x0, 0x0)         = 92466 0
 1703/0x16932:      2958       8      0 issetugid(0x0, 0x0, 0x0)         = 0 0
 1703/0x16932:      2975       8      1 csrctl(0x0, 0x7FFEEE21DC3C, 0x4)         = 0 0
 1703/0x16932:      2985      12      6 csops(0x0, 0x0, 0x7FFEEE21E550)      = 0 0
 1703/0x16932:      3100      13      3 shared_region_check_np(0x7FFEEE21DA98, 0x0, 0x0)    
...
  • Что вызывает эту ошибку?
  • Как получить команду execve, чтобы я мог видеть вызываемую программу и ее аргументы?

1 Ответ

0 голосов
/ 15 ноября 2018

Это означает, что сценарий 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.)

...