Помните, я рассказывал о пользе 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