从DTrace脚本调用C函数

dme*_*ter 3 dtrace

DTrace是源自Solaris的令人印象深刻,功能强大的跟踪系统,但它被移植到FreeBSD和Mac OSX.

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);
}
Run Code Online (Sandbox Code Playgroud)

使用命令行sudo dtrace -q -s <name>.d <pid>记录源自该进程的所有IO.

我的问题是,是否以及如何在跟踪本身期间从DTrace脚本调用自定义C函数以使用该跟踪数据执行高级操作.

Sni*_*gus 6

由于无法在D中编写循环的相同原因,DTrace明确禁止您执行此类操作:如果以任何方式,形状或形式将其搞砸,则会导致整个系统崩溃.当D探测器触发时,您处于KERNEL模式,而不是用户空间.让我引用"Linux内核模块编程指南:"

所以,你想编写一个内核模块.你知道C,你已经编写了许多正常的程序来作为进程运行,现在你想要到达实际操作的位置,一个狂野指针可以消灭你的文件系统,核心转储意味着重新启动.

这就是为什么你不想在D探测中扮演牛仔以及为什么D的限制对你有好处.=]