Интерпретируйте вывод dtruss как «psynch_cvwait() = -1 Err#316».

dtruss кажется полезным инструментом для анализа (неправильного) поведения приложений в OS X. Я нашел то, что закрывает мой любимый strace в Linux. Но интерпретация его вывода требует понимания системных вызовов, на которые он ссылается, а иногда и условий ошибок, которые они могут генерировать. Возьмем, к примеру, строку

psynch_cvwait(0x6BE38D54, 0x100000100, 0x0)      = -1 Err#316

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

Какой справочный документ подходит для изучения системных вызовов OS X, подобных этому?

Чем больше системных вызовов охватывает ваш справочник, тем лучше.


person MvG    schedule 03.12.2012    source источник


Ответы (3)


Единственная документация, которую я нашел по этому поводу, находится в самом коде.

Это часть ядра функций pthread_cond_wait() и pthread_cond_timedwait().

В данном случае это последнее, так как код ошибки #316. psync_cvcontinue устанавливает два бита в коде ошибки, чтобы указать, истекло ли время ожидания (0x100) или ожидающих не было (0x200). Ошибка № 316 (0x13C) — это тайм-аут побитового ИЛИ с ETIMEDOUT (60).

https://github.com/apple/darwin-libpthread/blob/master/kern/kern_synch.c#L1216 https://github.com/apple/darwin-xnu/blob/master/bsd/sys/errno.h#L179

person Jeff Mahoney    schedule 22.05.2018
comment
Побитовые операции во многом объясняют, почему поиск grep по кодовой базе не выявил этого. Большое спасибо! - person MvG; 22.05.2018

На основе ответа от Рэнди Ховард, я просмотрел исходный код XNU для этого. Файл syscalls.master содержит список всех системных вызовов. Этот файл описывает подпись psynch_cvwait следующим образом:

uint32_t
psynch_cvwait(
  user_addr_t cv,
  uint64_t cvlsgen,
  uint32_t cvugen,
  user_addr_t mutex,
  uint64_t mugen,
  uint32_t flags,
  int64_t sec,
  uint32_t nsec)

который, похоже, не очень похож на вывод dtruss, указанный в вопросе. Фактическая реализация в pthread_support.c все-таки полезнее:

/*
 *  psynch_cvwait: This system call is used for psynch cvar waiters to block in kernel.
 */
int
psynch_cvwait(__unused proc_t p,
              struct psynch_cvwait_args * uap,
              uint32_t * retval)

Это, по крайней мере, дает представление о том, что представляют собой аргументы, напечатанные dtruss. Похоже, что вторая может быть структурой, члены которой описаны в файле syscalls.master. Таким образом, адрес будет бесполезен, а фактические члены, по-видимому, вообще не печатаются dtruss. Настроив dtruss, возможно, удастся добраться до членов этой структуры, хотя я далеко не уверен на этот счет и удивляюсь, почему до сих пор этого никто не сделал.

Мне не так повезло, когда я пытался связать вообще какое-либо значение с выводом Err#316. Даже просматривая весь исходный код XNU как для десятичного, так и для шестнадцатеричного представления числа 316, я не нашел ни одного случая, который не включал бы и другие цифры. Код ошибки, конечно, не упоминается в самой реализации psynch_cvwait, но эта реализация пересылает коды ошибок из других функций, которые она вызывает. На самом деле нужен отладчик ядра, чтобы распутать это и отследить фактический источник этого значения.

В целом я на очень маленький шаг приблизился к пониманию вывода dtruss, но с большим трудом. Таким образом, надлежащий справочный документ и любое понимание источника этого кода ошибки все равно будут очень признательны.

person MvG    schedule 22.04.2013
comment
Относительно того, почему ответ Рэнди был удален: он был помечен как ответ, состоящий не более чем из внешних ссылок. Ответы, содержащие только ссылки, обычно не одобряются и обычно не связаны с заданным вопросом, но этот был актуален. Я восстановил его в результате. - person Brad Larson; 23.04.2013
comment
Я рад, что вы добились прогресса в этом. Похоже, вы лучше всего подходите для написания этого документа в ближайшее время. Причина того, что мой ответ в первую очередь является ссылкой, заключается в том, что исходный вопрос специально искал документацию, которая могла бы ему помочь. Неодобрительно или нет, это то, что я пытался предоставить. - person Randy Howard; 24.04.2013

Это может быть хорошей отправной точкой для ознакомления с работой dtrace. http://www.mactech.com/articles/mactech/Vol.23/23.11/ExploringLeopardwithDTrace/index.html

Что касается системных вызовов, вы можете начать здесь. http://www.opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/kern/syscalls.master

http://developer.apple.com и http://www.opensource.apple.com, где можно найти более подробную информацию.

Книга Амита Сингха «Внутреннее устройство Mac OS X — системный подход» — еще одна полезная вещь.

person Randy Howard    schedule 14.03.2013