【问题标题】:Interpret dtruss output like “psynch_cvwait(...) = -1 Err#316”解释 dtruss 输出,如“psynch_cvwait(...) = -1 Err#316”
【发布时间】:2012-11-20 18:18:59
【问题描述】:

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

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

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

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

您的参考文献涵盖的系统调用越多越好。

【问题讨论】:

    标签: macos wait system-calls dtrace darwin


    【解决方案1】:

    这可能是一个很好的起点,只是为了熟悉 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”一书是另一本有用的书。

    【讨论】:

      【解决方案2】:

      基于Randy Howardan answer,为此我查看了XNU source code。文件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 输出相关联时,我不太幸运。即使对 316 的十进制和十六进制表示形式的整个 XNU 源代码进行 grep,我也没有发现不包含其他数字的事件。 psynch_cvwait 本身的实现中当然没有提到错误代码,但该实现确实从它调用的其他函数转发错误代码。确实需要一个内核调试器来解决这个问题并跟踪该值的实际来源。

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

      【讨论】:

      • 关于 Randy 的答案被删除的原因:它被标记为仅包含外部链接的答案。仅链接的答案通常不受欢迎,并且通常与所提出的问题无关,但这个问题是相关的。结果我取消了它。
      • 很高兴您在这方面取得了进展。听起来您可能最适合尽快编写此文档。我的回答主要是链接的原因是最初的问题是专门寻找可能对他有帮助的文档。是否皱眉,这就是我试图提供的。
      【解决方案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

      【讨论】:

      • 按位运算在很大程度上解释了为什么对代码库进行 grep 搜索没有发现这一点。非常感谢!
      猜你喜欢
      • 2012-10-21
      • 1970-01-01
      • 1970-01-01
      • 2015-11-11
      • 2016-08-18
      • 2011-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多