【问题标题】:Find process where a particular system call returns a particular error查找特定系统调用返回特定错误的进程
【发布时间】:2016-07-02 03:25:12
【问题描述】:

在 OS X El Capitan 上,我的日志文件 system.log 有时会包含数百行以下内容

03/07/2016 11:52:17.000 kernel[0]: hfs_clonefile: cluster_read failed - 34

但没有迹象表明发生这种情况的过程。除此之外,磁盘工具找不到文件系统的任何故障。但我仍然想知道发生了什么,在我看来,dtrace 应该非常适合找出错误的进程,但我被卡住了。我知道函数返回探针,但它似乎需要 PID,例如

dtrace -n 'pidXXXX::hfs_clonefile:return { printf("ret: %d", arg1); }'

有没有办法告诉 dtrace 探测所有进程?然后我将如何打印进程名称?

【问题讨论】:

  • 什么版本的 macOS?
  • 根据本次讨论discussions.apple.com/thread/4940204?tstart=034 用于“磁盘已满”错误。
  • 您的日志文件中实际包含什么?他们如何强烈建议hfs_clonefile 遇到错误?除了日志消息之外,还有更多的事情发生吗?也就是说,是否存在问题的“真实”症状?对于它的价值,hfs_clonefile() 不是系统调用。它似乎是 HFS(+) 文件系统实现的内部函数。

标签: macos dtrace


【解决方案1】:

您可以尝试这样的事情(我无法访问 OS X 机器来测试它)

#!/usr/sbin/dtrace -s
# pragma D option quiet

fbt::hfs_clonefile:return
/ args[ 1 ] != 0 /
{
    printf( "\n========\nprocess: %s, pid: %d, ret value: %d\n", execname, pid, args[ 1 ] );
    /* get kernel and user-space stacks */
    stack( 20 );
    ustack( 20 );
}

对于fbt 探测器,args[ 1 ] 是函数返回的值。

只要返回值不为零,dTrace 脚本就会从hfs_clonefile() 打印出进程名称、pid 和返回值。它还添加了内核和用户空间堆栈跟踪。这应该足以让您找到错误的来源。

无论如何,假设它可以在 OS X 上运行。

【讨论】:

  • pointed out Ken Thomases 中,函数 hfs_clonefile 在hfs_readwrite.c 中被声明为静态,因此 dtrace 没有对其进行探测。但是通过分析源代码,我可以找到哪些函数调用了 hfs_clonefile 并进行了探测。例如,您的方法适用于 hfs_relocate。所以谢谢!
【解决方案2】:

您可以使用syscall 提供程序而不是pid 提供程序来执行此类操作。比如:

sudo dtrace -n 'syscall::hfs_clonefile*:return /errno != 0/ { printf("ret: %d\n", errno); }'

上述命令是基于 DTrace 的内置 errinfo 实用程序中使用的一个次要变体。您可以在任何编辑器中查看/usr/bin/errinfo 以了解其工作原理。

但是,至少就 DTrace 而言,在我的 El Capitan (10.11.5) 系统上没有 hfs_clonefile 系统调用:

$ sudo dtrace -l -n 'syscall::hfs*:'

   ID   PROVIDER            MODULE                          FUNCTION NAME
dtrace: failed to match syscall::hfs*:: No probe matches description

另外,不幸的是,syscall 提供程序被 El Capitan (macOS 10.11) 引入的系统完整性保护功能阻止跟踪系统进程。因此,您将不得不禁用 SIP,这会降低您的系统安全性。

【讨论】:

  • 有趣的是没有 dTrace 探测。这似乎是源代码:fxr.watson.org/fxr/source/bsd/hfs/… OS X 上的 dTrace 是否提供了一组有用的fbt 探针?
  • 你找到了一个函数。并非内核中的所有函数都是系统调用。这似乎是 HFS(+) VFS(虚拟文件系统)实现的内部功能。我不确定fbt 提供商的探测,但是,它再次被 SIP 禁用。您可能会编辑您的问题,以解释您首先怀疑此功能存在错误的原因以及您关心的原因。 IE。除了日志消息还有什么症状?
  • 为什么我怀疑问题出在hfs_clonefile()?因为 OP 的问题指出“hfs_clonefile 失败,错误代码为 34”。
  • 抱歉,没仔细看,以为你是 OP。我打算问 OP 他为什么怀疑。
猜你喜欢
  • 2014-12-20
  • 2011-01-14
  • 2012-06-01
  • 2014-10-09
  • 1970-01-01
  • 2015-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多