Помните, я рассказывал о пользе strace под Linux для исследования системы и поиска проблем?

Для Mac OS X есть аналогичная утилита на базе DTrace – dtruss.

Сегодня при помощи двух команд “sudo dtruss -n xftpd -f” и “sudo tcpdump -i lo0 port 53″ я разобрался в мистической проблеме длительных задержек при заходе на Mac OS X Server по FTP.

Примеры использования dtruss

Показать системные вызовы всех xftpd (-n xftpd) с отслеживанием дочерних процессов (-f):

$ sudo dtruss -n xftpd -f
	PID/THRD  SYSCALL(args) 		 = return
24804/0x76294:  getpid(0x0, 0x0, 0x0)		 = 24804 0
24804/0x76294:  open_nocancel("/dev/urandom\0", 0x0, 0x0)		 = 3 0
24804/0x76294:  read_nocancel(0x3, "\2315\336\347\3546\355K\230\326r\2534qn\177\377\250;\0353\367\2769=a\363\350\255\032\361\017z\022\367\257;\315\363\vSg\021\"\252\211KSM\0", 0x74)		 = 116 0
24804/0x76294:  close_nocancel(0x3)		 = 0 0
24804/0x76294:  __sysctl(0xBFFFDC4C, 0x3, 0xBFFFDC5C)		 = 0 0
24804/0x76294:  issetugid(0xBFFFDC4C, 0x3, 0xBFFFDC5C)		 = 0 0
24804/0x76294:  geteuid(0xBFFFDC4C, 0x3, 0xBFFFDC5C)		 = 0 0
24804/0x76294:  __sysctl(0xBFFFDC14, 0x2, 0xBFFFDBDC)		 = 0 0
24804/0x76294:  __sysctl(0xBFFFDBDC, 0x2, 0xBFFFDC5C)		 = 0 0
24804/0x76294:  shared_region_check_np(0xBFFFDE30, 0x2, 0xBFFFDC5C)		 = 0 0
24804/0x76294:  stat64("/usr/lib/libobjc.A.dylib\0", 0xBFFFCF6C, 0xBFFFDC5C)		 = 0 0
24804/0x76294:  stat64("/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation\0", 0xBFFFCF6C, 0xBFFFDC5C)		 = 0 0
24804/0x76294:  stat64("/System/Library/Frameworks/Security.framework/Versions/A/Security\0", 0xBFFFCF6C, 0xBFFFDC5C)		 = 0 0
24804/0x76294:  stat64("/System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices\0", 0xBFFFCF6C, 0xBFFFDC5C)		 = 0 0
24804/0x76294:  stat64("/System/Library/Frameworks/Kerberos.framework/Versions/A/Kerberos\0", 0xBFFFCF6C, 0xBFFFDC5C)		 = 0 0
...

Проанализировать вызовы при запуске программы “df -k”:

$ sudo dtruss df -k

По процессу с нужным pid:

$ sudo dtruss -p 1637