Понимание вывода dtruss

Может ли кто-нибудь указать мне ссылку на то, как понять/интерпретировать отчет, выведенный dtruss (mac) или dtrace?

Я только что попробовал dtruss на простой программе. Например, я получил следующий вывод:

PID/THRD  SYSCALL(args)          = return
250/0x103c:  getattrlist("/Volumes/CORE/CORE.app\0", 0x7FFF5E8045D8, 0x7FFF5E804250)         = 0 0
250/0x103c:  geteuid(0x7FFF5E8045E0, 0x0, 0x7FFF5E804A18)        = 501 0
250/0x103c:  geteuid(0x7FFF5E805DF0, 0x0, 0x7FFF5E805E80)        = 501 0
250/0x103c:  geteuid(0x7FFF5E805540, 0x0, 0x7FFF5E805770)        = 501 0
250/0x103c:  getattrlist("/.vol/16777224/21\0", 0x7FFF5E8046D0, 0x7FFF5E803CF0)      = 0 0
250/0x103c:  geteuid(0x7FFF5E805950, 0x0, 0x7FFF5E8059C8)        = 501 0
250/0x103c:  __mac_syscall(0x7FFF8D22057C, 0x50, 0x7FFF5E805990)         = 0 0
250/0x103c:  geteuid(0x7FFF5E805950, 0x0, 0x7FFF5E8059C8)        = 501 0
250/0x103c:  __mac_syscall(0x7FFF8D22057C, 0x51, 0x7FFF5E8059A8)         = -1 Err#30
250/0x103c:  geteuid(0x7FFF5E8057D0, 0x0, 0x7FFF5E805848)        = 501 0
250/0x103c:  getattrlist("/.vol/16777224/21\0", 0x7FFF5E804960, 0x7FFF5E803F80)      = 0 0
250/0x103c:  open("/.vol/16777224/21\0", 0x0, 0x1FF)         = 6 0
250/0x103c:  geteuid(0x7FFF5E805790, 0x0, 0x7FFF5E805920)        = 501 0

Я вижу все эти системные вызовы, принимающие шестнадцатеричные параметры. Но как мне их расшифровать? Например, как узнать, какой файл он на самом деле пытается открыть?


person Gary    schedule 31.10.2012    source источник
comment
Вывод не похож на машинный код, это список всех выполняемых системных команд. Ознакомьтесь со списком системных команд Linux (или выполните поиск Unix/BSD/MacOS/и т. д.): linux.about.com/od/commands/l/blcmdl_2a.htm   -  person newfurniturey    schedule 31.10.2012


Ответы (2)


В вашем примере вывод показывает путь для системного вызова open() ("/.vol/16777224/21").

dtruss — это сценарий оболочки/DTrace, аналогичный инструменту truss из Solaris (strace в Linux). Эти инструменты написаны так, чтобы понять, как отображать аргументы в удобочитаемой форме. Я закодировал некоторые из них в инструменте dtruss, но его можно улучшить, чтобы понять больше. Вы можете сделать копию dtruss и настроить ее, чтобы добавить что-то, так как это сценарий оболочки/DTrace.

Для системных вызовов, которые показывают шестнадцатеричные числа, вы можете начать с чтения справочной страницы, чтобы узнать, что такое аргументы. Например, у geteuid() нет аргументов, поэтому поведение dtruss по умолчанию, печатающее 3 как шестнадцатеричное, сбивает с толку. Он не должен печатать ничего и показывать возвращаемое значение. Например, это можно сделать, изменив следующий раздел:

 /* print 0 arg output */
 syscall::*fork:return
 /self->start/
 {

to:

 /* print 0 arg output */
 syscall::*fork:return,
 syscall::geteuid:return
 /self->start/
 {
person Brendan Gregg    schedule 03.03.2014
comment
К вашему сведению, этот ответ исходит прямо от автора dtruss — человека, легенды, Брендана Грегга. - person Edward Ocampo-Gooding; 21.04.2020
comment
Обновленный dtruss для macOS см. на странице github.com/microsoft/. скаляр/блоб/мастер/скрипты/Mac/трассировка/ - person Edward Ocampo-Gooding; 17.05.2020

dtrace — это низкоуровневый, но мощный инструмент, позволяющий отслеживать многие события на уровне ядра. То, что отслеживается или отображается, указывается в сценарии dtrace. Эти системные вызовы являются функциями уровня ядра, вызываемыми отслеживаемой программой (а не самими функциями пользовательского уровня).

dtrace позволяет отслеживать/количественно оценивать процессор, диск, память, файловую систему, сеть и т. д. для каждого процесса или группы процессов.

Одной из ссылок является сайт Open Solaris DTrace, однако существует множество веб-сайтов. на основе руководств и инструкций.

Чтобы увидеть, какие файлы открываются процессами, вы бы использовали:

dtrace -n 'syscall::open*:entry { printf("%s %s",execname,copyinstr(arg0)); }'
person PaulS    schedule 11.02.2013