19

dtrussstrace似乎是一个有用的工具来分析 OS X 上应用程序的(错误)行为。我在 linux 上找到了我心爱的人。但是解释它的输出需要理解它所引用的系统调用,有时还需要理解它们可能产生的错误条件。以这条线为例

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

我对一个文档源感兴趣,它可以让我找出这个系统调用的目的,它的参数意味着什么,以及这个错误代码代表什么。就像我对 libc 函数手册页所期望的一样。我要求提供描述上述和类似系统调用的参考,以及上述和类似的错误。因此,只需以该行作为我希望能够理解的输出类型的示例。

什么是合适的参考文档来了解像这样的 OS X 系统调用?

您的参考资料涵盖的系统调用越多越好。

4

3 回答 3

13

根据Randy Howard的回答,我查看了XNU 源代码。该文件包含所有系统调用的列表。该文件描述了这样的签名:syscalls.masterpsynch_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在尝试将任何含义与该输出相关联时,我不太幸运。即使对 316 的十进制和十六进制表示形式的整个 XNU 源代码进行 grep,我也没有发现不包含其他数字的事件。错误代码当然没有在其psynch_cvwait自身的实现中提及,但该实现确实从它调用的其他函数转发错误代码。人们真的需要一个内核调试器来解开它并跟踪该值的实际来源。

总的来说,我现在离理解输出更近了一小步dtruss,但还有很多工作要做。因此,仍然非常感谢您提供适当的参考文档以及对该错误代码来源的任何见解。

于 2013-04-22T13:57:25.470 回答
6

这可能是一个很好的起点,只是为了熟悉 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.comhttp://www.opensource.apple.com是查找更多详细信息的地方。

以书的形式,Amit Singh 的“Mac OS X Internals -- A Systems Approach”是另一个有用的东西。

于 2013-03-14T20:11:22.097 回答
5

我在这方面找到的唯一文档是代码本身。

它是 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

于 2018-05-22T18:04:11.413 回答