- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想在 FreeBSD 10.1 上编写一个 C 程序,使用 libdtrace
实现 DTrace 消费者。
我知道我需要先调用 dtrace_open()
- 例如我找到了 this旧演示文稿,但我什至无法开始,因为没有安装 dtrace.h
(仅在系统源代码树中)。
共享库已安装,例如FreeBSD 中包含的 /usr/sbin/dtrace
工具可以充当 DTrace 使用者,该工具链接到 /lib/libdtrace.so.2
(也指向通过来自 /usr/lib/libdtrace.so
的符号链接(symbolic link)。
任何基本示例,包括构建说明 (FreeBSD 10.1/clang) 都会对我有很大帮助。
编写自定义消费者的实际目标是创建一个 CFFI基于包装器可用于 Python 和 PyPy . 意思是:上面的C程序只是入门,学习再进行。
CFFI 是将 PyPy 与共享库连接起来的推荐的现代高性能方式。
CFFI 可用于 ABI和 API 级别。后者需要一个头文件来包含,前者需要声明从库中使用的东西。
改编自 Adam 的回答,这是一个适用于 FreeBSD 10.1 的完整示例。
生成文件
:
all:
cc \
-I /usr/src/cddl/compat/opensolaris/include \
-I /usr/src/cddl/contrib/opensolaris/lib/libdtrace/common/ \
-I /usr/src/sys/cddl/compat/opensolaris \
-I /usr/src/sys/cddl/contrib/opensolaris/uts/common/ \
hello_dtrace.c \
-l dtrace -l proc -l ctf -l elf -l z -l rtld_db -l pthread -l util \
-o hello_dtrace
hello_dtrace.c
:
#include <dtrace.h>
#include <signal.h>
#include <stdio.h>
static dtrace_hdl_t* g_dtp;
static int chewrec (const dtrace_probedata_t *data, const dtrace_recdesc_t *rec, void *arg) {
printf("chewing dtrace record ..\n");
// A NULL rec indicates that we've processed the last record.
if (rec == NULL) {
return (DTRACE_CONSUME_NEXT);
}
return (DTRACE_CONSUME_THIS);
}
static const char* g_prog = "BEGIN { printf(\"hello from dtrace\\n\"); }";
//static const char* g_prog = "syscall::open*:entry { printf(\"%s %s\\n\", execname, copyinstr(arg0)); }";
static int g_intr;
static int g_exited;
static void intr (int signo) {
g_intr = 1;
}
int main (int argc, char** argv) {
int err;
if ((g_dtp = dtrace_open(DTRACE_VERSION, 0, &err)) == NULL) {
fprintf(stderr, "failed to initialize dtrace: %s\n", dtrace_errmsg(NULL, err));
return -1;
}
printf("Dtrace initialized\n");
(void) dtrace_setopt(g_dtp, "bufsize", "4m");
(void) dtrace_setopt(g_dtp, "aggsize", "4m");
printf("dtrace options set\n");
dtrace_prog_t* prog;
if ((prog = dtrace_program_strcompile(g_dtp, g_prog, DTRACE_PROBESPEC_NAME, 0, 0, NULL)) == NULL) {
fprintf(stderr, "failed to compile dtrace program\n");
return -1;
} else {
printf("dtrace program compiled\n");
}
dtrace_proginfo_t info;
if (dtrace_program_exec(g_dtp, prog, &info) == -1) {
fprintf(stderr, "failed to enable dtrace probes\n");
return -1;
} else {
printf("dtrace probes enabled\n");
}
struct sigaction act;
(void) sigemptyset(&act.sa_mask);
act.sa_flags = 0;
act.sa_handler = intr;
(void) sigaction(SIGINT, &act, NULL);
(void) sigaction(SIGTERM, &act, NULL);
if (dtrace_go(g_dtp) != 0) {
fprintf(stderr, "could not start instrumentation\n");
return -1;
} else {
printf("instrumentation started ..\n");
}
int done = 0;
do {
if (!g_intr && !done) {
dtrace_sleep(g_dtp);
}
if (done || g_intr || g_exited) {
done = 1;
if (dtrace_stop(g_dtp) == -1) {
fprintf(stderr, "could not stop tracing\n");
return -1;
}
}
switch (dtrace_work(g_dtp, stdout, NULL, chewrec, NULL)) {
case DTRACE_WORKSTATUS_DONE:
done = 1;
break;
case DTRACE_WORKSTATUS_OKAY:
break;
default:
fprintf(stderr, "processing aborted");
return -1;
}
} while (!done);
printf("closing dtrace\n");
dtrace_close(g_dtp);
return 0;
}
运行:
[oberstet@brummer2 ~/hello_dtrace]$ make; sudo ./hello_dtrace
cc -I /usr/src/cddl/contrib/opensolaris/lib/libdtrace/common/ -I /usr/src/sys/cddl/compat/opensolaris -I /usr/src/sys/cddl/contrib/opensolaris/uts/common/ hello_dtrace.c -l dtrace -l proc -l ctf -l elf -l rtld_db -l z -l pthread -l util -o hello_dtrace
Dtrace initialized
dtrace options set
dtrace program compiled
dtrace probes enabled
instrumentation started ..
chewing dtrace record ..
hello from dtrace
chewing dtrace record ..
^Cclosing dtrace
最佳答案
libdtrace
API 不一定适用于稳定的消费者,但可以很容易地从一些现有消费者那里学习并开始使用。最简单和最现代的是plockstat
,用于用户空间锁定统计的 illumos 实用程序。
这是一个简单的 DTrace 消费者程序的基本流程:
dtrace_open()
获取 dtrace_hdl_t,其他 libdtrace
交互的句柄dtrace_setopt()
配置选项(-x
标记为 dtrace(1M)
)dtrace_strcompile()
编译 D 程序的字符串dtrace_program_exec()
将该程序发送到内核dtrace_go()
检测系统并开始记录数据dtrace_close()
最后清理
对于主数据收集循环(在 dtrace_go()
和 dtrace_close()
之间)执行以下操作:
dtrace_sleep()
根据 DTrace 选项(switchrate 和 aggrate)暂停dtrace_work()
处理跟踪数据dtrace_stop()
中止
参见plockstat.c
中的主循环了解更多。
对于其他简单的 DTrace 使用者,请查看 intrstat
和 lockstat
.对于厨房水槽,查看 dtrace(1M) 命令行实用程序的代码。
关于c - 用 C 编写 DTrace 使用者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28011495/
如何使用 dtrace 访问函数的局部变量? 例如,在下面的代码片段中,我想使用 dtrace 了解变量 x 的值。 void foo(int a){ int x=some_fun(a);
我有一个 DTrace 探针捕获对函数的调用,该函数的参数之一是 CFStringRef。这是保存指向 unicode 字符串的指针的私有(private)结构。但 CFStringRef 本身并不是
DTrace令人印象深刻的强大的跟踪系统,最初来自 Solaris,但它被移植到 FreeBSD 和 Mac OSX。 DTrace 使用称为 D 的高级语言,与 AWK 或 C 不同。下面是一个示例
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
抱歉,标题很复杂,但这是我脚本的 dtrace 输出,我认为这将有助于解释我正在谈论的内容: 16384 1 38048
假设我的应用代码如下所示: #include int global_var; void change_var(){ global_var++; } int main(void){
我编写了一个 DTrace 脚本,用于测量在我的 C 程序中的一个函数内花费的时间。程序本身运行,输出一些数据然后退出。 问题是它完成了让我快速获取进程 ID 并启动 DTrace 的方法。 目前我的
dtrace 是否可用于多线程应用程序,我可以分析单个内核吗?如果是这样,有人会给我举个例子吗? 最佳答案 DTrace 非常适合锁分析,因为它能够根据需要动态检测锁事件。以下命令和提供程序可用于锁分
我有一台 2009 年中的 MacBook Pro 和一台新的 2012 MacBook Pro,我正在学习 DTrace(一个非常棒的工具)。当我在新的 2012 MBP 上计算聚合时,聚合不会打印
当我要求提供工具来分析 Rails 应用程序时,有人 pointed at DTrace .由于我在 MacOSX 工作站上工作并在 OpenSolaris 上进行部署,因此这是一种有效的方法。但我对
这个问题几乎概括了一切。 “dtrace 'print an associative array'” 在 Google 上只有一次点击,类似的搜索同样毫无用处。 编辑: 如果我使用聚合,我不知道我仍然
如果重要的话,我使用的是 Mac OS X,但我相信这适用于所有操作系统。如果每个操作系统的答案不同,我也会有兴趣了解这一点。 假设我打开一个终端窗口,启用几个探测器,并开始使用 DTrace 收集数
我在网上搜索可以帮助我进行流水线分析的东西。我在 http://www.webservertalk.com/message897404.html 上搜索并找到了一些东西 这个问题有两个部分;查找特定类
我正在使用 dtrace 打印代码中的所有 objc_msgSend。到目前为止,我可以看到选择器的名称,但无法获得正确的类名。 这是我的 dtrace 脚本: #!/usr/sbin/dtrace
我引入了一个环境选项,它会在启动时暂停我的进程,这样我就可以附加 dtrace(通过 XCode Instruments)并开始分析。然后我必须在进程上按 enter 键才能开始运行。我想知道我的进程
我在 dhcpagent 命令和测试中做了一些更改,它有点失败。现在我知道在 dhcpagent 退出之前到底调用了哪个函数。我想跟踪从 dhcpagent 到那个特定函数的控制让我们说 foo()。
我正在尝试测试 this script from oracle to get active NFS clients在 Ubuntu 10.04 上,但我无法让它运行。 为了实现这一点,我首先在 the
代码 dtrace -n 'syscall::read:entry /execname != "dtrace"/ { @reads[execname, fds[arg0].fi_pathname] =
我正在我的 restify.js 应用程序中跟踪 DTrace 探测器(重新确定它是 node.js 中提供 dtrace 支持的 http 服务器)。我正在使用 restify 文档中的示例 dtr
如何使用dtrace查看下面简单程序的调用堆栈、返回值和参数 /** Trival code **/ #include int foo (int *a, int *b) { *a
我是一名优秀的程序员,十分优秀!