DTrace是一个令人印象深刻、功能强大的跟踪系统,最初来自Solaris,但它移植到了FreeBSD和Mac上。
DTrace使用一种称为D的高级语言,与AWK或C不同。下面是一个示例:
io:::start
/pid == $1/
{
printf("file %s offset %d size %d block %llu\n", args[2]->fi_pathname,
args[2]->fi_offset, args[0]->b_bcount, args[0]->b_blkno);
}使用命令行sudo dtrace -q -s <name>.d <pid>记录该进程产生的所有IO。
我的问题是,在跟踪过程中,是否可以以及如何从DTrace脚本调用自定义C函数来对跟踪数据执行高级操作。
发布于 2010-04-28 04:45:12
DTrace explicity阻止您这样做的原因与您不能用D编写循环的原因相同:如果您以任何方式、形状或形式搞砸了它,就会使整个系统崩溃。当D探测器触发时,您处于内核模式,而不是userland。让我引用"Linux内核模块编程指南“中的内容:
因此,您想要编写一个内核模块。您知道C语言,您已经编写了许多作为进程运行的常规程序,现在您希望了解真正的操作所在,在那里,单个野指针可以清除您的文件系统,核心转储意味着重新启动。
这就是为什么你不想在D探测器中扮演牛仔的原因,以及为什么D的限制对你有好处。=]
发布于 2013-05-30 07:23:18
由于@Sniggerfardimungus提到的原因,不可能从你的探测器内部调用任意的C,但你可能只想对收集到的数据进行一些操作(将其存储在数据库中/用它进行一些计算或可视化等),而这在C中是完全可能的(通过一些其他语言中的C包装器)。
为此,可以使用libdtrace (在我的Mac机器上,头部在/usr/include/dtrace.h中)或它的包装器,比如node-libdtrace。基本思想是,您可以构建自己的DTrace数据消费者(实际上,取代dtrace(1m)命令行工具),它接收来自正在运行的任何脚本的输出。一旦你有了数据,你就可以随心所欲地处理它了。
发布于 2013-12-17 06:35:12
编辑我最初的答案为时已晚,但是您还可以在DTrace脚本中使用system()命令,在DTrace中发生事件时生成一个运行任意代码的子进程。这可能是一个选项,因此您必须在D脚本中使用-w命令行选项或#pragma D option destructive指令。请注意,如果您不小心使用破坏性操作,可能会挂起、无限循环、终止或以其他方式破坏您正在探测的进程。(我不建议使用内核破坏性操作,除非您真的不关心当您的系统意外搞砸时是否会崩溃。)
您可以使用system()运行的脚本来调用您的任意C代码(或者向另一个进程发送一个信号来调用它,等等)。
https://stackoverflow.com/questions/2183981
复制相似问题