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

17

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

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

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

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

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

    
задан MvG 03.12.2012 в 10:45
источник

3 ответа

1

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

Это сторона ядра pthread_cond_wait () и pthread_cond_timedwait ().

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

Ссылка Ссылка

    
ответ дан Jeff Mahoney 22.05.2018 в 20:04
  • Побитовые операции идут длинным путем, объясняя, почему поиск grep по кодовой базе не выявил этого. Большое спасибо! –  MvG 22.05.2018 в 21:31
11

На основе ответа Рэнди Ховард , я взглянул на исходный код 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 , но с большой работой. Поэтому правильный ссылочный документ и любое понимание источника этого кода ошибки все равно будут высоко оценены.

    
ответ дан MvG 22.04.2013 в 15:57
  • Относительно того, почему ответ Рэнди был удален: он был помечен как ответ, состоящий только из внешних ссылок. Ответы только на ссылку, как правило, не одобряются и обычно не связаны с вопросом, но этот вопрос имеет значение. В результате я удалил его. –  Brad Larson♦ 23.04.2013 в 21:22
  • Я рад, что вы достигли прогресса в этом. Похоже, вы могли бы лучше всего написать этот документ в ближайшее время. Причина, по которой мой ответ в основном связан, заключается в том, что исходный вопрос специально искал документацию, которая могла бы ему помочь. Нахмуренный или нет, именно это я и пытался предоставить. –  Randy Howard 24.04.2013 в 03:41
4

Это может быть хорошей отправной точкой, просто для знакомства с операцией dtrace. Ссылка

Что касается системных вызовов, вы можете начать здесь. Ссылка

ссылка и ссылка - это места чтобы найти больше деталей.

В виде книги Амит Сингх (Amit Singh) - «Внутренние компоненты Mac OS X - системный подход» - еще одна полезная вещь.

    
ответ дан Randy Howard 14.03.2013 в 21:11