查找特定系统调用返回特定错误的进程

时间:2016-07-02 03:25:13

标签: macos dtrace

在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探测所有进程?然后我将如何打印流程名称?

2 个答案:

答案 0 :(得分:0)

您可以使用syscall提供程序而不是pid提供程序来执行此类操作。类似的东西:

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

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

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

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

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

另外,遗憾的是,{Caperis(MacOS 10.11)引入的系统完整性保护功能阻止了syscall提供程序跟踪系统进程。因此,您必须禁用SIP,这会降低系统的安全性。

答案 1 :(得分:0)

您可以尝试这样的事情(我无法访问OS X计算机进行测试)

namespace std;
int divison(int,int);
int main()
{
    void readData(int tempArray[ ]);

    int tempInput[10];
    readData(tempInput);

    //int size=10;              //Array size

    int sum =0;
    //for(int i=0;i<size;i++)   //Loop which inputs arrays data and
    // {
            //cout << myArray[i] << endl;
    // }

    return 0;     
}

对于#!/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是函数返回的值。

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

无论如何,假设它适用于OS X.