Macos 解释DTRUS输出,如“;psynch#u cvwait(…)=-1错误316”;

Macos 解释DTRUS输出,如“;psynch#u cvwait(…)=-1错误316”;,macos,wait,system-calls,dtrace,darwin,Macos,Wait,System Calls,Dtrace,Darwin,dtruss似乎是一个分析OS X上应用程序(错误)行为的有用工具。我在linux上找到了我心爱的strace。但是解释它的输出需要理解它所指的系统调用,有时还需要理解它们可能产生的错误条件。以生产线为例 psynch_cvwait(0x6BE38D54, 0x100000100, 0x0) = -1 Err#316 我对一个文档源感兴趣,它可以让我了解这个系统调用的目的,它的参数表示什么,以及这个错误代码代表什么。很像我期望的libc函数主页。我要求提供一个参考,其中描述了上述和类

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

psynch_cvwait(0x6BE38D54, 0x100000100, 0x0)      = -1 Err#316
我对一个文档源感兴趣,它可以让我了解这个系统调用的目的,它的参数表示什么,以及这个错误代码代表什么。很像我期望的libc函数主页。我要求提供一个参考,其中描述了上述和类似的系统调用,以及上述和类似的错误。以这行代码为例,我希望能够理解输出的类型

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


参考范围内的syscalls越多越好。

这可能是一个很好的起点,只是为了熟悉dtrace操作

至于系统调用,您可以从这里开始

是寻找更多细节的地方

在书中,阿米特·辛格(Amit Singh)的《Mac OS X内部结构——系统方法》是另一个有用的东西。

基于,我看了一下这方面的指南。该文件包含所有系统调用的列表。该文件描述了
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)
这似乎与问题中引用的
dtrus
输出不太相似。中的实际实现更有用,不过:

/*
 *  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)
这至少提供了一个关于
dtrus
打印的参数的概念。看起来第二个可能是一个结构,其成员由
syscalls.master
文件描述。因此,地址将没有什么用处,而且实际成员显然根本不是由DTRUS打印的。调整dtruss也许有可能获得该结构的成员,尽管我对此还不确定,并且想知道为什么还没有人这样做

我不太幸运地试图将任何意义与
Err#316
输出关联起来。即使将整个XNU源代码的十进制和十六进制表示形式的316都变灰,我也没有发现不包含其他数字的情况。在
psynch_cvwait
本身的实现中当然没有提到错误代码,但该实现确实会从它调用的其他函数中转发错误代码。我们确实需要一个内核调试器来解开这个问题,并跟踪该值的实际来源


总的来说,我现在离理解
dtrus
输出又近了一小步,但需要做大量的工作。因此,如果能提供一份适当的参考文档以及对错误代码来源的任何深入了解,我将不胜感激。

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

它是pthread_cond_wait()和pthread_cond_timedwait()的内核端

在本例中,是后者,因为错误代码为#316。psync_cvcontinue在错误代码中设置两位,以指示等待超时(0x100)还是没有等待器(0x200)。错误#316(0x13C)是按位或与ETIMEDOUT(60)的超时位


关于Randy的答案被删除的原因:它被标记为只包含外部链接的答案。只有链接的答案通常不受欢迎,通常与所问的问题无关,但这一个是相关的。结果我取消了它。我很高兴你在这方面取得了进展。听起来您可能是最适合尽快编写此文档的人。我的回答主要是链接的原因是,最初的问题特别是寻找可能对他有帮助的文档。不管我是否反对,这就是我试图提供的。按位操作可以很好地解释为什么对代码库进行grep搜索时没有发现这一点。谢谢!