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